개인 프로젝트
LoginFilter, JWTFilter, Spring Security 인증 과정
오마이냥
2024. 8. 7. 13:06
LoginFilter
- LoginFilter는 사용자가 로그인할 때 작동한다.
- 사용자가 이메일과 비밀번호를 입력하여 로그인 요청을 하면 attemptAuthentication 메서드가 호출되어 인증을 시도한다.
- 인증이 성공하면 successfulAuthentication 메서드가 호출되어 JWT 토큰이 생성되고 Authorization 헤더에 포함되어 응답으로 반환된다.
JWTFilter
- JWTFilter는 모든 요청에 대해 JWT 토큰을 검사한다.
- 사용자가 로그인 후 다른 API 요청을 할 때, 요청 헤더에 포함된 JWT 토큰을 검증하여 유효성을 체크하고, 유효한 토큰일 경우 사용자 정보를 설정하여 Spring Security Context에 저장한다.
- JWTFilter는 로그인 과정과는 무관하게 동작하며, 로그인 이후의 모든 요청에 대해 작동한다.
작동 흐름
로그인 시
- 사용자가 이메일과 비밀번호를 입력하여 /login 엔드포인트에 POST 요청을 보낸다.
- LoginFilter가 요청을 가로채고 attemptAuthentication 메서드에서 이메일과 비밀번호를 추출하여 인증을 시도한다.
- 인증이 성공하면 succeddfulAuthentication 메서드가 호출된다.
- 이 메서드에서 사용자 정보를 기반으로 JWT 토큰을 생성한다.
- 생성한 JWT 토큰을 Authoriztion 헤더에 포함하여 응답으로 반환한다.
- 사용자는 이 JWT 토큰을 클라이언트 측에 저장하고, 이후 모든 API 요청 시 이 토큰을 Authorization 헤더에 포함하여 보낸다.
API 요청 시
- 사용자가 로그인 후 API 요청을 보낼 때, 클라이언트는 JWT 토큰을 Authorization 헤더에 포함하여 요청을 보낸다.
- JWTFilter가 요청을 가로채고, doFilterInternal 메서드에서 Authorization 헤더를 확인한다.
- JWT 토큰이 유효하면, 토큰에서 사용자 정보(역할 등)를 추출한다.
- 추출한 정보를 바탕으로 사용자 인증 객체를 생성하여 Spring Security Context에 저장한다.
- 요청을 다음 필터 또는 서블릿으로 전달한다.
요약하면,
LoginFilter는 로그인 요청 시 이메일과 비밀번호를 인증하고, JWT 토큰을 생성하여 클라이언트에 반환하며,
JWTFilter는 모든 요청에서 JWT 토큰을 검증하여 유효한 토큰인 경우 사용자 정보를 추출하고, 인증 객체를 생성하여 설정한다.
Spring Security 인증 과정
- 로그인 요청
클라이언트가 이메일과 비밀번호를 포함한 로그인 요청은 "/api/account/login" 엔드 포인트로 보낸다. - LoginFilter
LoginFilter는 로그인 요청을 가로채고 이메일과 비밀번호를 추출하여
UsernamePasswordAuthenticationToken을 생성한다. 이 토큰은 인증 시도(attemptAuthentication)에 사용된다. - AuthenticationManager
AuthenticationManager는 UsernamePasswordAuthenticationToken을 사용하여 인증을 처리한다. 이때 CustomUserDetailsService를 호출하여 사용자의 세부 정보를 로드한다. - CustomUSerDetailsService
CustomUserDetailsService는 주어진 이메일로 데이터베이스를 조회하고, 사용자 정보를 포함한 CustomUserDetails 객체를 반환한다. 이 객체에는 Member Entity 정보가 포함된다. - Authentication 성공
인증이 성공하면 LoginFilter의 successfulAuthentication 메서드가 호출된다. 여기서 CustomUserDetails 객체를 사용하여 JWT 토큰을 생성한다.