Spring Security 로그인/JWT를 bottom-up으로 이해하고자 한다.

이 문서를 순서대로 읽으면 아래에 답할 수 있게 된다.

로그인 요청은 username/password를 Authentication으로 만들고, AuthenticationManager가 ProviderManager를 통해 적절한 AuthenticationProvider에 검증을 위임한다.

username/password 방식이면 DaoAuthenticationProvider가 UserDetailsService를 통해 MyBatis로 사용자를 조회하고, PasswordEncoder.matches로 비밀번호 해시를 검증한다.

성공하면 인증된 Authentication이 만들어지고, 현재 요청의 SecurityContextHolder에 저장된다.

이후 요청에서는 AuthorizationFilter가 현재 Authentication의 authorities와 요청 URL의 권한 규칙을 비교해 허용 여부를 판단한다.

JWT 방식에서는 세션에서 인증 상태를 복원하지 않으므로, 매 요청마다 Bearer token을 검증해 Authentication을 다시 구성해야 한다.

그리고 JWT access token은 만료 전까지 자체적으로 유효하므로, 로그아웃, 탈취, 비밀번호 변경 대응을 위해 refresh token 저장소, jti denylist, tokenVersion 같은 별도 무효화 전략이 필요하다.