Spring Security

JWT 기반 인증을 쓰다 보면 “DB에서는 이미 사용자가 삭제됐는데, 앱에서는 여전히 로그인 상태로 남아있는” 이상한 상황을 경험할 때가 있다. 나 역시 최근 이런 문제를 직접 겪었다. 로그아웃도 안 한 상태에서 DB에서 바로 사용자 데이터를 삭제했더니 앱을 껐다 켜도 여전히 로그인 상태로 유지됐다. 로그아웃을 해도 잘 안되고 결국 앱 캐시를 지우니까 그제야 초기화되었다. 처음엔 단순한 캐시 문제인 줄 알았는데 파악해보니까 원인은 훨씬 근본적이었다. 바로 JWT의 무상태 구조와 블랙리스트의 동작 방식 때문이다. JWT의 본질: 서버는 아무것도 기억하지 않는다. JWT는 서버가 세션을 저장하지 않는다. 토큰 안에 사용자 정보, 만료 시간, 서명이 모두 들어있기 때문이다. 서버는 요청마다 서명이 유효한가..
JWT는 로그인한 사용자를 인증하기 위해 가장 널리 쓰이는 방식이다. 서버가 세션을 직접 저장하지 않아도 되기 때문에 무상태이면서도 서명 검증만으로 사용자를 확인할 수 있다. 근데 단순한 만큼 치명적인 약점이 있다. 서버가 한 번 발급한 토큰을 강제로 무효화할 수 없다는 점이다. 서버가 잃어버린 통제권 JWT는 한 번 발급되면 그 안에 exp(만료시간)이 고정된다. 이 말은 서버가 그 토큰을 회수하거나 취소할 방법이 없다는 뜻이다. 사용자가 로그아웃 해도 기존 토큰은 유효하고 비밀번호 변경해도 이전 토큰으로 접근 가능하고 토큰이 유출되면 서버는 막을 방법이 없다. 결국에 서버가 다시 상태를 관리하는 방법을 찾아봐야 한다. 그게 바로 블랙리스트 구조이다. 블랙리스트란? JWT는 기본적으로 sta..
hskhsmm
'Spring Security' 태그의 글 목록