개인 프로젝트

LoginFilter, JWTFilter, Spring Security 인증 과정

오마이냥 2024. 8. 7. 13:06

LoginFilter

  • LoginFilter는 사용자가 로그인할 때 작동한다.
  • 사용자가 이메일과 비밀번호를 입력하여 로그인 요청을 하면 attemptAuthentication 메서드가 호출되어 인증을 시도한다.
  • 인증이 성공하면 successfulAuthentication 메서드가 호출되어 JWT 토큰이 생성되고 Authorization 헤더에 포함되어 응답으로 반환된다.

 

JWTFilter

  • JWTFilter는 모든 요청에 대해 JWT 토큰을 검사한다.
  • 사용자가 로그인 후 다른 API 요청을 할 때, 요청 헤더에 포함된 JWT 토큰을 검증하여 유효성을 체크하고, 유효한 토큰일 경우 사용자 정보를 설정하여 Spring Security Context에 저장한다.
  • JWTFilter는 로그인 과정과는 무관하게 동작하며, 로그인 이후의 모든 요청에 대해 작동한다.

 

작동 흐름

로그인 시

  1. 사용자가 이메일과 비밀번호를 입력하여 /login 엔드포인트에 POST 요청을 보낸다.
  2. LoginFilter가 요청을 가로채고 attemptAuthentication 메서드에서 이메일과 비밀번호를 추출하여 인증을 시도한다.
  3. 인증이 성공하면 succeddfulAuthentication 메서드가 호출된다.
    1. 이 메서드에서 사용자 정보를 기반으로 JWT 토큰을 생성한다.
    2. 생성한 JWT 토큰을 Authoriztion 헤더에 포함하여 응답으로 반환한다.
  4. 사용자는 이 JWT 토큰을 클라이언트 측에 저장하고, 이후 모든 API 요청 시 이 토큰을 Authorization 헤더에 포함하여 보낸다.

 

API 요청 시

  1. 사용자가 로그인 후 API 요청을 보낼 때, 클라이언트는 JWT 토큰을 Authorization 헤더에 포함하여 요청을 보낸다.
  2. JWTFilter가 요청을 가로채고, doFilterInternal 메서드에서 Authorization 헤더를 확인한다.
  3. JWT 토큰이 유효하면, 토큰에서 사용자 정보(역할 등)를 추출한다.
  4. 추출한 정보를 바탕으로 사용자 인증 객체를 생성하여 Spring Security Context에 저장한다.
  5. 요청을 다음 필터 또는 서블릿으로 전달한다.

 

요약하면,

LoginFilter는 로그인 요청 시 이메일과 비밀번호를 인증하고, JWT 토큰을 생성하여 클라이언트에 반환하며,

JWTFilter는 모든 요청에서 JWT 토큰을 검증하여 유효한 토큰인 경우 사용자 정보를 추출하고, 인증 객체를 생성하여 설정한다.

 

 

Spring Security 인증 과정

  1. 로그인 요청
    클라이언트가 이메일과 비밀번호를 포함한 로그인 요청은 "/api/account/login" 엔드 포인트로 보낸다.
  2. LoginFilter
    LoginFilter는 로그인 요청을 가로채고 이메일과 비밀번호를 추출하여
    UsernamePasswordAuthenticationToken을 생성한다. 이 토큰은 인증 시도(attemptAuthentication)에 사용된다.
  3. AuthenticationManager
    AuthenticationManager는 UsernamePasswordAuthenticationToken을 사용하여 인증을 처리한다. 이때 CustomUserDetailsService를 호출하여 사용자의 세부 정보를 로드한다.
  4. CustomUSerDetailsService
    CustomUserDetailsService는 주어진 이메일로 데이터베이스를 조회하고, 사용자 정보를 포함한 CustomUserDetails 객체를 반환한다. 이 객체에는 Member Entity 정보가 포함된다.
  5. Authentication 성공
    인증이 성공하면 LoginFilter의 successfulAuthentication 메서드가 호출된다. 여기서 CustomUserDetails 객체를 사용하여 JWT 토큰을 생성한다.