부제) JWT 기반 인증 환경에서의 토큰 검증 과정

이전 글에 generateToken()으로 토큰이 생성되는 과정을 정리했다. 이후 클라이언트가 HTTP 요청의 Authorization 헤더에 토큰을 담아서 보냈을 때 그 토큰이 유효한지 검사하는 과정이다.

전체적으로 Authentication 객체를 생성하기 위한 과정중 일부인데, Authentication 객체를 다시 생성하는 이유는 다음과 같다.

쿠키, 세션 환경에서는 세션이 존재하기 때문에 SecurityContextHolderFilter가 자동으로 세션에서 SecurityContext를 조회해 SecurityContextHolder에 등록(자세하게는 실행중인 현재 스레드의 ThreadLocalMap에 등록)한다.

정확히는

SecurityContextHolderFilter ↓ SecurityContextRepository 조회 ↓ HttpSessionSecurityContextRepository ↓ 세션에서 SecurityContext 조회 ↓ SecurityContextHolder 저장

하지만 JWT 환경에서는 세션이 존재하지 않기 때문에 SecurityContextHolderFilter가 SecurityContext 조회를 시도하더라도 세션에 저장된 SecurityContext를 복원할 수 없다. 따라서 JWT 필터를 직접 작성하여 요청마다 필터를 통해 토큰을 검증한뒤 매번 Authentication을 생성해서 SecurityContextHolder에 직접 등록해야 한다. 수정) 이렇게 하면 이후에 실행되는 Spring Security와 애플리케이션 코드에서 현재 인증된 사용자 정보를 참조할 수 있다.

로그인 성공:

POST /login

서버

{
	"accessToken": "eyJhbGciOiJIUzI1NiJ9..."
}

반환

클라이언트가 저장

이후 요청마다