이 글에서는 Spring Framework로 HTTP 세션을 처리하는 방법을 정리한다.

세션 생성 정책

Spring의 세션 생성 정책을 설정하기 위해서는 @Configuration 클래스 대신 WebSecurityConfigurerAdapter를 상속한 클래스를 생성하고 @EnableWebSecurity 어노테이션을 붙여준 클래스에서 설정 가능하다. 그 중 아래의 메서드를 오버라이딩 해야된다.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
}

정책에는 다음과 같이 4가지가 있다.

  • always: 세션이 아직 존재하지 않으면 생성
  • ifRequired: 요구하는 경우에만 세션을 생성(기본값)
  • never: 프레임워크가 세션을 만들지는 안지만 이미 세션을 사용 중인 경우 그 세션을 사용
  • stateless: 세션을 생성하지도 사용하지도 않는다.

동시 세션 제어

이미 인증 된 사용자가 다시 인증 요청을 하면 1. 기존 사용자의 세션을 무효화하고 새 세션으로 사용자를 다시 인증하거나 2. 두 세션이 동시에 존재하도록 허용할 수 있다.

동시 세션을 지원하기 위해서는 다음과 같이 Bean을 정의해야된다.

@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
    return new HttpSessionEventPublisher();
}

동시 세션의 개수를 제한하기 위해서는 앞에 나왔던 configure()메서드에 다음과같이 설정해야된다.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.sessionManagement().maximumSessions(2)
}

세션 시간 초과

세션 시간 처리

사용자가 시간이 만료된 세션을 사용하여 요청을 보내면 다른 url로 리다이렉트되게 설정 가능하다. 아래의 예시는 시간이 만료된 세션을 보낼 경우 ‘/sessionExpired.html’로, 유효하지 않은 세션 ID를 보낼 경우 ‘/invalideSession.html’로 리다이렉트 된다.

세션 시간 설정

properties를 이용하여 세션 시간을 지정할 수 있다. 별도의 단위를 입력하지 않으면 초로 간주한다.

server.servelt.session.timeout=15m

세션 쿠키 보호

httpOnlysecure 플래그를 이용하여 세션 쿠키를 보호할 수 있다.

  • httpOnly: true면 브라우저의 스크립트가 쿠키에 접근할 수 없다.
  • secure: true면 HTTPS 연결을 통해서만 전송된다.

아래와 같이 Java를 통해 설정가능하다.

public class MainWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        // ...
        sc.getSessionCookieConfig().setHttpOnly(true);        
        sc.getSessionCookieConfig().setSecure(true);        
    }
}

Spring Boot의 경우는 properties 파일을 통해서 설정할 수 있다.

server.servlet.session.cookie.http-only=true
server.servlet.session.cookie.secure=true

세션 사용하기

@Scope 어노테이션을 통해 session 스코프로 Bean을 정의할 수 있다.

@Component
@Scope("session")
public class Foo { .. }

다음과 같이 Controller 메서드에서 세션을 등록할 수 있다.

@RequestMapping(..)
public void fooMethod(HttpSession session) {
    session.setAttribute(Constants.FOO, new Foo());
    //...
    Foo foo = (Foo) session.getAttribute(Constants.FOO);
}

참고 자료

https://www.baeldung.com/spring-security-session

https://kimchanjung.github.io/programming/2020/07/02/spring-security-02/

댓글남기기