본문 바로가기

spring security

기억하기 인증 - rememberMe()

정수원님의 **스프링 시큐리티 완전 정복** 강의 내용 기록입니다 !!

 

 

 

RememberMe 인증
  • 사용자가 웹 사이트나 애플리케이션에 로그인할 때 자동으로 인증 정보를 기억하는 기능
  • UsernamePasswordAuthenticationFilter와 함께 사용됨
  • 폼인증 / httpBasic 인증 등 인증 방식의 인터페이스에 포함됨 → 인증 과정 내부에서 호출됨!
  • 인증 성공 시 RememberMeServices.loginSuccess() ≫ RememberMe 토큰을 생성하고 쿠키로 전달
  • 인증 실패 시 RememberMeServices.loginFail() ≫ 쿠키를 지움 (보안을 위해 기존 저장되어 있던 쿠키도 삭제)
  • LogoutFilter와 연계하여 로그아웃 시 쿠키를 지움

 

토큰 생성
  • 기본적으로 암호화된 토큰으로 생성됨
    • 단방향이기 때문에 복호화되지 않음
    • 유출되면 그 토큰 정보로 로그인은 가능 / 유출된 토큰을 통해 개인정보 식별은 불가
  • 브라우저에 쿠키를 통해 토큰을 보냄 → 세션에서 이 쿠키를 감지하여 자동 로그인이 이루어지는 방식
  • base64(username + ":" + expirationTime + ":" + algorithmName + ":" +
    algorithmHex(username + ":" + expirationTime + ":" + password + ":" + key))
    • username : UserDetailService로 식별 가능한 사용자 이름
    • password : 검색된 UserDetails에 일치하는 비밀번호
    • expirationTime : remember-me 토큰이 만료되는 날짜와 시간, 밀리초로 표현
    • key : remember-me 토큰의 수정을 방지하기 위한 개인 키
    • algorithmName : remember-me 토큰 서명을 생성하고 검증하는 데 사용되는 알고리즘 (기본적으로 SHA-256 알고리즘 사용)
    • algorithmHex : 이 부분이 암호화되는 정보

 

RememberMeServices 구현체
  • RememberMeServices는 인터페이스, 2가지 구현체가 있음
  • 해싱을 통해 암호화된 RememberMe 토큰을 생성하고 쿠키로 전달하는 역할
  • TokenBasedRememberMeServices : 쿠키 기반 (메모리 방식) 토큰의 보안을 위해 해싱을 사용
  • PersistentTokenBasedRememberMeServices : 생성된 토큰을 저장하기 위해 데이터베이스나 다른 영구 저장 매체를 사용
  • 대부분 TokenBasedRememberMeServices로 처리해도 문제 없음
  • 두 구현 모두 사용자의 정보를 검색하기 위한 UserDetailsService가 필요 : 해싱에 필요한 username, password 등의 정보를 가져오기 위해

 

rememberMe() API
  • RememberMeConfigurer 설정 클래스를 통해 여러 API들을 설정할 수 있음
  • 내부적으로 RememberMeAuthenticationoFilter가 생성되어 자동 인증 처리를 담당

  • alwaysRemember : 기억하기(remember-me) 매개변수가 설정되지 않았을 때에도 쿠키가 항상 생성되어야 하는지 여부
    • 즉, 기억하기 인증을 위한 체크박스에 체크하지 않아도 항상 기억하기 기능을 유지할 건지
    • 기본값은 false
    • true로 설정하지 않는 것이 일반적
  • tokenValiditySeconds : 토큰이 유효한 시간 지정 (초 단위)
  • userDetailsService : UserDetails를 조회하기 위해 사용되는 UserDetailsService 지정
  • rememberMeParameter : 로그인 시 사용자를 기억하기 위해 사용되는 HTTP 매개변수
    • input 태그(체크박스)의 name 지정
    • 기본값은 'remember-me'
    • 기본값과 다른 값을 지정한 경우, Spring Security가 생성해주는 기본 로그인 페이지에는 자동 적용되지만 따로 로그인 페이지를 만드는 경우 name 속성을 동기화시켜야 함

  • rememberMeCookieName : 기억하기(remember-me) 인증을 위한 토큰을 저장하는 쿠키 이름
    • 기본값은 'remember-me'
    • 토큰의 이름 지정

  • key : 기억하기(remember-me) 인증을 위해 생성된 토큰을 식별하는 키 설정 → 개인 키 !

 

동작 과정

 

1. rememberMe() API 설정

  • alwaysRemember : false

2. 인증 없이 localhost:8080 접속 → 로그인 페이지

  • remember-me 기능을 위한 체크박스 생성됨

3. 체크박스 체크 후 로그인

 

4. 

  • 세션 쿠키 이외에 'remember' 토큰이 함께 전달됨
  • 값은 암호화된 토큰값

5. 세션 쿠키 삭제 후 다시 접속 → remember 쿠키 존재하므로 로그인이 유지됨

 

6. remember 쿠키까지 모두 삭제 후 다시 접속 → 재인증 필요 → 로그인 페이지