Spring Security와 JWT를 결합하여 인증을 처리할 때, 클라이언트가 보내는 JWT 토큰을 서버가 어떻게 처리하는지 이해하는 것이 중요하다.
JwtAuthenticationFilter 필터에서 resolveToken(request) 메서드를 호출하여 HTTP 요청 헤더에서 JWT 토큰을 추출한다. 이때, Authorization 헤더에서 Bearer 타입의 토큰을 받는다.jwtUtil.validateToken(token) 메서드를 호출하여 토큰이 유효한지 확인한다. 유효성 검증은 주로 토큰의 서명, 만료 시간 등을 체크하는 작업이다.jwtUtil.getAuthentication(token) 메서드를 호출하여 Authentication 객체를 생성한다. 이 객체는 토큰에서 추출한 사용자 정보와 권한 정보를 담고 있다.SecurityContextHolder.getContext().setAuthentication(authentication)을 통해 SecurityContext에 인증된 사용자의 정보를 설정한다. 이를 통해 이후 요청 처리에서 Spring Security는 해당 사용자가 인증된 상태로 동작한다. 즉, 요청을 처리하는 동안 SecurityContext에서 인증된 사용자 정보를 가져와 접근을 허용하거나 거부할 수 있다.로그인 : 사용자가 로그인하면, 서버는 사용자 정보를 검증한 후 JWT 토큰을 발급한다. 이 토큰은 서버에서 발급한 정보가 담겨 있으며, 이후 요청에서 인증을 위한 '열쇠'로 사용된다.
토큰을 통한 인증: 클라이언트는 JWT를 Authorization 헤더에 담아 서버에 요청을 보낸다. 요청 헤더의 형식은 Bearer {token}이다. 서버는 이 토큰을 JwtAuthenticationFilter에서 받아서 유효성을 검사한다.
필터를 통한 인증: JwtAuthenticationFilter에서 토큰을 받아 유효성을 검사하고, 유효한 토큰이면 SecurityContext에 인증 정보를 설정한다. 이 과정에서 SecurityContextHolder를 통해 인증된 사용자 정보를 Spring Security의 컨텍스트에 저장한다.
인증 정보 확인: Spring Security는 요청을 처리할 때마다 SecurityContext에서 인증된 사용자가 있는지 확인한다. SecurityContext에 인증 정보가 있으면, 해당 사용자는 인증된 상태로 요청을 처리하게 된다.
인증된 사용자는 SecurityContext에 설정된 정보에 기반하여 권한을 체크한다. 예를 들어, @PreAuthorize 어노테이션이나 @Secured 어노테이션을 사용하여 해당 요청을 처리할 수 있는 권한이 있는지 확인한다.
만약 인증되지 않은 사용자가 요청을 보내면, Spring Security는 401 Unauthorized 상태 코드를 반환하고, 인증을 요구하는 페이지로 리디렉션할 수 있다.
시큐리티와 JWT를 처음 적용해놓고 점검을 제대로 못하고 있었다. 그래서 오늘 흐름을 살펴보던 중, 헷갈리는 부분도 있었고, 여전히 어려운 시큐리티와 JWT를 다시 말로 풀어 정리해보며 되짚어봤습니다.
그 중 SecurityContext 부분이 좀 더 확실히 이해된 것 같다.
하나라도 알고 자는게 어디야 😁 자야겠당