Spring 개념정리

[Spring] MVC : 세션, 인터셉터, 쿠키

개발자 문문 2025. 7. 7. 21:54

안녕하세요 개발자 문문입니다.

오늘은 Spring MVC의 세션, 인터셉터, 쿠키에 대해 공부해보겠습니다.

 

로그인 상태를 유지하는 방법으로는 크게 세션과 쿠키 두가지 방법이 있습니다.

먼저 HttpSession을 사용하는 방법을 먼저 보겠습니다.

  • HttpSession
@PostMapping
public String form(LoginCommand loginCommand, Errors errors, HttpSession session) {
...
@PostMapping
public String submit(LoginCommand loginCommand, Errors errors, HttpSevletRequest req) {
	HttpSession session = req.getSession();
...

 

- HttpSession을 사용하는 두 가지 방법인데, 두 방법의 차이는 첫 번째 방법은 항상 HttpSession을 생성하지만, 두 번째 방법은 필요할 때만 생성할 수 있습니다.

  • 주로 사용하는 메서드

    - HttpSession.getSession() : 존재하는 세션을 불러오는 메서드 입니다.

    - HttpSession.setAttribute("속성명", 객체) :  속성명의 속성에 객체를 저장합니다. 

    - HttpSession.getAttribute("속성명") :  세션에 "속성명"으로 저장된 객체를 불러옵니다. 세션이 유지되는 동안 불러올 수 있습          니다. 

    - HttpSession.invalidate() : 세션을 해제하는 메서드 입니다.

 

  • 인터셉터

- HandlerInterceptor : 다수의 컨트롤러에 대해 동일한 기능을 적용할 때 사용할 수 있는 인터페이스 입니다.

  • HandlerInterceptor는 컨트롤러 실행 전/ 실행 후, 뷰 실행전 / 뷰 실행 후 와 같이 세 시점에 공통 기능을 넣을 수 있습니다.
//컨트롤러 실행 전
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

//컨트롤러 실행 후, 뷰 실행 전
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;

//뷰 실행 후
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;

- preHandle : 컨트롤러 실행 전에 필요한 기능을 구현하고, 컨트롤러에서 필요로 하는 정보를 생성합니다.

- postHandle : 컨트롤러가 정상적으로 실행된 이후에 추가 기능을 구현할 때 사용합니다.

- afterCompletion : 뷰가 클라이언트에 응답을 전송한 뒤에 실행됩니다. 컨트롤러 실행중 익셉션 발생시 네 번째 파라미터로 전달됩니다. ex) 익셉션 로그 남기기, 실행 시간 기록

 

 

  • HandlerInterceptor 설정
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
	...
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	registry.addInterceptor(authCheckInterceptor())
        	.addPathPatterns("/edit/**");
    }
    
    @Bean
    public AuthCheckInterceptor authCheckInterceptor() {
    	return new AuthCheckInterceptor();
    }
}

- addInterceptors() : 인터셉트를 설정하는 메서드로, AuthCheckInterceptor를 인터셉터로 설정하고, /edit/로 시작하는 모든 경로에 이 인터셉트를 적용합니다.

 

  • 쿠키

- @CookieValue : HTTP 요청에 포함된 쿠키 값을 가져올 수 있게 해줍니다. (Cookie에 적용)

@GetMapping
public String form(LoginCommand loginCommand, @CookieValue(value="REMEMBER", required=false) Cookie rCookie) {
	if(rCookie != null) {
    	loginCommand.setEmail(rCookie.getValue());
        loginCommand.setRememberEmail(true);
     }
     return "login/loginForm";
 }

- value : 쿠키의 이름 지정 , required : 필수 여부

 

  • 쿠기 생성
@PostMapping
public String submit(LoginCommand loginCommand, Errors errors, HttpSession session, HttpServletResponse response) {
	new LoginCommandValidator().validate(loginCommand, errors);
    ...
    
    Cookie rememberCookie = new Cookie("REMEMBER", loginCommand.getEmail());
    rememberCookie.setPath("/");
    if(loginCommand.isRememberEmail()) {
    	rememberCookie.setMaxAge(60*60*24*30);
    } else {
    	rememberCookie.setMaxAge(0);
    }
    response.addCookie(rememberCookie);
    
    ...