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 발급 + 응답
- 로그인 요청에
remember-me=true파라미터 포함 - 인증 성공 시
remember-me쿠키를 추가로 발급 - 이후
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 환경에서 사용해야 한다.