세션 관리 고도화 시리즈 (4/4)

이전 편: [Spring Security] 3. SessionRegistry로 온라인 상태 관리

이 문서가 시리즈의 마지막 편입니다.


RememberMe란?

로그인 시 "로그인 유지" 옵션을 선택하면 세션이 만료되거나 JSESSIONID 쿠키가 삭제돼도 자동으로 다시 로그인되는 기능이다.

일반 로그인과의 차이는 다음과 같다:

일반 로그인RememberMe
인증 수단JSESSIONID 쿠키remember-me 쿠키
브라우저 종료 시세션 만료쿠키 유지
만료 기간서버 세션 타임아웃설정한 기간 (기본 2주)

동작 방식

sequenceDiagram participant Client participant Filter as Security Filter Client->>Filter: POST /login (remember-me=true) Filter->>Filter: 인증 성공 Filter-->>Client: JSESSIONID + remember-me 쿠키 발급 Note over Client: JSESSIONID 삭제 (브라우저 종료 등) Client->>Filter: 다음 요청 (remember-me 쿠키만 포함) Filter->>Filter: remember-me 쿠키로 자동 인증 Filter-->>Client: 새 JSESSIONID 발급 + 응답
  1. 로그인 요청에 remember-me=true 파라미터 포함
  2. 인증 성공 시 remember-me 쿠키를 추가로 발급
  3. 이후 JSESSIONID가 없어도 remember-me 쿠키로 자동 인증

SecurityConfig 설정

http
    .rememberMe(remember -> remember
        .key("uniqueAndSecretKey")
        .tokenValiditySeconds(86400 * 14)
        .rememberMeParameter("remember-me")
    )
  • key("uniqueAndSecretKey") : remember-me 토큰 서명에 사용하는 비밀 키. 서버 재시작 후에도 토큰이 유효하려면 고정값으로 설정해야 한다
  • tokenValiditySeconds(86400 * 14) : 토큰 유효 기간. 86400초 = 1일, 14일로 설정
  • rememberMeParameter("remember-me") : 클라이언트가 보내는 파라미터 이름
[실수] key를 설정하지 않으면

서버가 재시작될 때마다 랜덤 key가 생성된다. 재시작 후 기존 remember-me 쿠키가 모두 무효화된다.


remember-me 파라미터 전달 방식

Spring Security 폼 로그인은 application/x-www-form-urlencoded로 파라미터를 받는다. 프론트에서 JSON으로 요청하는 경우 remember-me 파라미터가 전달되지 않을 수 있다.

JSON 로그인과 RememberMe

JSON body로 로그인하는 경우 커스텀 필터에서 직접 remember-me 값을 파싱해 처리해야 한다. 폼 로그인 방식이라면 파라미터로 자동 인식된다.


두 가지 RememberMe 구현 방식

Hash-Based Token (기본값)

http.rememberMe(remember -> remember.key("secret"))
  • username + 만료시간 + password + key를 해시해서 쿠키에 저장
  • DB 불필요, 간단
  • 단점: 비밀번호가 변경되면 기존 토큰이 무효화됨

Persistent Token (DB 기반)

http.rememberMe(remember -> remember
    .tokenRepository(persistentTokenRepository())
)
  • 토큰을 DB에 저장
  • 비밀번호가 바뀌어도 토큰 유지 가능
  • 토큰 탈취 감지 가능 (같은 토큰이 두 번 사용되면 의심)
  • 단점: DB 테이블 필요
어떤 방식을 선택할까?

간단한 구현이 목적이라면 Hash-Based, 보안이 중요하거나 "어디서 로그인됐는지 관리" 기능이 필요하다면 Persistent를 선택하면 된다.


자주 하는 실수

[실수] 로그아웃 시 remember-me 쿠키도 삭제해야 함

로그아웃해도 remember-me 쿠키가 남아 있으면 다시 자동 로그인된다. Spring Security의 기본 로그아웃은 자동으로 처리하지만, 커스텀 로그아웃 핸들러를 사용하는 경우 직접 삭제해야 한다.

[!WARNING] [실수] HTTPS 없이 remember-me 쿠키 사용

remember-me 쿠키가 탈취되면 장기간 계정이 노출된다. 반드시 HTTPS 환경에서 사용해야 한다.