Spring Boot: auth-jwt

🍀 Spring Boot Boilerplate
  1. Spring Boot Boilerplate
  2. Spring Boot: auth-jwt

1. 소개




2. ERD 구조

erd




3. RestAPI




4. /api/auth/login

login

전체 구조



로그인 요청과 Security Filter Chain 진입

login

  1. Login 요청
    • POST /api/auth/login 요청
    • {"email": "user@test.com", "password": "1234"}
  2. Security Filter
    • 로그인 요청은 반드시 Spring Security FilterChain 을 거친다
    • JwtAuthenticationFilter
      • resolveToken(request) 를 실행해 쿠키나 헤더에 토큰이 있는지 찾는다
      • 로그인 시점에는 토큰이 없으므로 token == null
      • 따라서 조용히 다음 필터로 이동한다
    • AuthorizationFilter
      • 이 요청이 권한이 필요한가? 를 확인한다
      • SecurityConfigpermitAll() 설정에 의해 로그인 요청은 인증 객체 없어도 통과된다


Controller와 Service 진입

login

  1. AuthController 진입
    • @Valid 를 통해 Request의 형식이 맞는지 검사한다
    • 통과하면 userService를 호출한다
  2. UserService 진입
    • 사용자가 입력한 이메일 + 평문 비밀번호를 담은 임시 인증용 토근을 발급한다
    • 임시 토큰: UsernamePasswordAuthenticationToken
    • 이 토큰을 AuthenticationManager 에게 던진다
    • 이 사람 진짜 유저인지 너가 검증해줘!


Spring Security 핵심 인증 처리

login

  1. AuthenticationManager
    • UserService 에게 받은 요청을 어떤 Provider에게 위임할지 결정한다
    • ... 살펴보다가 AuthenticationProvider 에게 위임!
  2. CustomUserDetailService ↭ UserRepository ↭ DB
    • AuthenticationProvider 는 유저 검증을 위해서 DB에 있는 실제 유저 정보가 필요하다. 그러나 스스로 가져올 수 없으므로...
    • CustomUserDetailService를 호출해 DB에 있는 유저 정보를 가져온다
  3. 다시 AuthenticationProvider
    • DB에서 가져온 정보와 사용자 입력 정보를 비교한다
    • 일치하는 경우 인증 성공!


토큰 발급 및 응답 마무리

login

  1. UserService
    • 인증 성공하여 돌아온 완성된 토큰을 JwtTokenProvider 에게 넘긴다
  2. JwtTokenProvider
    • generateToken() 으로 AccessToken, RefreshToken 을 생성한다
  3. UserService ↭ RefreshTokenRepository
    • 생성된 RefreshToken 을 DB에 저장한다
    • 저장 과정에서 현재 이메일로 저장된 토큰이 설정값을 넘으면 가장 오래된 것을 삭제한다
  4. 다시 AuthController
    • setTokenCookies() 으로 Access/Refresh Token 을 각각 HttpOnly 쿠키로 세팅한다
    • 최종적으로 클라이언트에게 200 OK로그인 성공 메세지를 담은 JSON(ApiResponse) 을 반환한다

5. Reference