Spring

[Spring Security] Remember-me를 통해 로그인 유지하기

꾸준함. 2022. 3. 27. 21:14

개요

Spring Security를 통해 로그인한 뒤 브라우저 쿠키를 확인해보면 JSESSIONID가 있는 것을 확인할 수 있습니다.
JSessionID는 Tomcat 컨테이너에서 세션을 유지하기 위해 발급한 키이며 HTTP 프로토콜은 기본적으로 stateless이기 때문에 상태를 저장하기 위해 Tomcat이 JSESSIONID 쿠키를 클라이언트에 발급한 것이며 해당 쿠키를 통해 세션을 유지합니다.
세션이 만료될 경우 쿠키 내 JSESSIONID가 사라지면서 로그인이 풀리게 되는데 세션이 만료되더라도 로그인을 유지하고 싶다면 Spring Security에서 제공해주는 Remember-me 쿠키를 사용해야 합니다.
이번 게시글에서는 Remember-me에 대해 간단하게 알아보겠습니다.

* 쿠키, 세션에 대한 개념이 모호하다면 아래 글부터 참고하는 것을 추천드립니다.
https://jaimemin.tistory.com/1885

[SpringBoot] 쿠키, 세션 개념 정리

개요 이번 포스팅에서는 로그인 기능을 구현할 때 꼭 필요한 개념인 쿠키와 세션에 대해 정리해보겠습니다. 실제 로그인과 관련된 코드 및 설명은 다음 글에서 정리하겠습니다. 쿠키 서버에서

jaimemin.tistory.com

1. 세션이 만료돼도 로그인을 유지하는 방법

세션이 만료되더라도 로그인을 유지하고 싶을 경우 쿠키에 인증 정보를 남겨두고 세션이 만료되었을 때 쿠키에 남아있는 정보로 인증하면 됩니다.


1.1 해시 기반 쿠키

가장 간단한 방법은 해시 기반의 쿠키를 사용하는 것인데 쿠키에 저장할 내용은 아래와 같습니다.

  • 아이디
  • 패스워드
  • 만료 시간 (expiration time)
  • 애플리케이션 고유 키


하지만 이 방법에는 치명적인 단점이 존재하는데 가령 Man in the Middle 공격을 당해 쿠키를 탈취당할 경우 해당 계정은 공공재가 됩니다.


1.2 아이디 + token

두 번째 방법은 첫 번째 방법을 소폭 개선한 방안입니다.
쿠키 안에 아이디와 랜덤한 문자열 즉, token을 저장하고 인증할 때마다 token을 변경하는 방법을 통해 탈취된 쿠키를 통해 매번 로그인하는 것을 방지할 수 있습니다.
하지만, 해당 방법도 해커가 먼저 쿠키로 인증할 경우 token 값이 바뀌기 때문에 계정 주인이 해당 쿠키를 통해 로그인하지 못한다는 단점이 존재합니다.


1.3 아이디 + token + series

세 번째 방법은 두 번째 방법에서 고정된 series 값을 추가하여 여태까지의 문제점을 해결합니다.
두 번째 방법과 마찬가지로 아이디와 인증할 때마다 바뀌는 token을 저장하고 추가로 랜덤하게 생성된 고정 series 값을 쿠키에 저장합니다.
해커가 쿠키를 탈취한 뒤 사용자가 로그인할 경우 아이디, 유효하지 않은 token과 유효한 series로 접속하게 되는데 이럴 경우 모든 token을 삭제하여 해커가 더 이상 탈취한 쿠키를 사용하지 못하도록 방지합니다.
모든 token이 삭제되므로 Spring Security에서 제공하는 로그인 form이 뜰 것이고 사용자는 해당 폼을 통해 다시 로그인을 해주면 됩니다.

2. Remember-me 적용 코드

아래에 적용된 코드는 보다 안전한 영속화 기반 Spring Security 설정(1.3 방법)을 통한 Remember-me 적용 방법입니다.
영속화 기반 Spring Security 경우 1.2 방법과 다르게 데이터베이스 내 token이 존재하는지 확인을 통해 유효성 검사를 진행하며 각각의 persistent remember-me 쿠키들을 아래 내용을 포함합니다.

  • series identifier: 앞서 설명한 series 값(사용자의 초기 로그인 식별하며 고정된 값)
  • token value: remember-me 기능을 사용하여 인증할 경우 매번 바뀌는 token 값

이처럼 series값과 token값이 쿠키에 포함되어 있으므로 앞서 설명한 1.3 방법처럼 보다 안전하게 로그인한 사용자를 인증할 수 있습니다.

해당 방법을 적용하기 위해서는 html form과 Spring Security를 설정하는 SecurityConfig.java를 수정해주면 됩니다.
해당 코드에서는 token을 JdbcTokenRepositoryImpl 클래스를 통해 생성하는데 이를 위해서는 persistent_logins 테이블이 필요합니다.


html form



SecurityConfig.java


* 여기서 AccountService는 UserDetailsService를 구현한 클래스입니다.


persistent_logins 테이블 DDL


참고

인프런 강의 - 스프링과 JPA 기반 웹 애플리케이션 개발 (백기선 강사님)

https://happyer16.tistory.com/entry/Spring-Security-remember-me%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%9C%A0%EC%A7%80%ED%95%98%EA%B8%B0

Spring Security - remember-me에 관하여 ( 로그인 유지하기 )

Remember-me architecture 로그인 기억하기를 구현할 때 굳이 전체 아키텍처를 이해하지 않아도 되지만, 커스터마이징이 많아질 수록 전체 흐름을 이해해야 구현하기 편해진다. 그래서 remember-me 전체

happyer16.tistory.com

반응형