2026.02.09
Spring Boot: auth-jwt
🍀 Spring Boot: Boilerplate 개발
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