Spring Boot: auth-jwt
🍀 Spring Boot Boilerplate
- Spring Boot Boilerplate
- Spring Boot: auth-jwt
1. 소개
- Spring Boot Boilerplate
auth-jwt-redis- Access Token + Refresh Token 전략
- Redis 활용 -> Refresh Token을 저장하여 보안성 강화
2. ERD 구조

3. RestAPI
/api/auth/register: 회원가입/api/auth/login: 로그인/api/auth/logout: 로그아웃/api/auth/reissue: 토큰재발급
4. /api/auth/login

전체 구조
로그인 요청과 Security Filter Chain 진입

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

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

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

- UserService
- 인증 성공하여 돌아온 완성된 토큰을
JwtTokenProvider에게 넘긴다
- 인증 성공하여 돌아온 완성된 토큰을
- JwtTokenProvider
generateToken()으로 AccessToken, RefreshToken 을 생성한다
- UserService ↭ RefreshTokenRepository
- 생성된
RefreshToken을 DB에 저장한다 - 저장 과정에서 현재 이메일로 저장된 토큰이 설정값을 넘으면 가장 오래된 것을 삭제한다
- 생성된
- 다시 AuthController
setTokenCookies()으로 Access/Refresh Token 을 각각 HttpOnly 쿠키로 세팅한다- 최종적으로 클라이언트에게
200 OK와로그인 성공메세지를 담은JSON(ApiResponse)을 반환한다
5. Reference
- https://velog.io/@dhkim1522/SpringSecurity-JWT-회원가입-로그인-기능-구현
- https://inkyu-yoon.github.io/docs/Language/SpringBoot/SpringSecurityJoin