내가 구현하고자 하는 프로젝트의 구조:
내가 구현한 클래스:
클래스별 역할 요약 정리:
![]() |
|---|
OAuth2 로그인 + JWT 발급 구조는 아래와 같이 동작한다:
[1] 프론트엔드: 구글 로그인 버튼 클릭
↓
[2] 백엔드: Spring Security OAuth2 로그인 처리
↓
[3] OAuth2 로그인 성공 시, 사용자 정보 받아옴
↓
[4] 자체 서버에서 JWT(Access + Refresh) 발급
↓
[5] Access Token → 프론트로 응답
Refresh Token → HttpOnly 쿠키로 저장
↓
[6] 이후 요청 시 Access Token으로 인증
[클라이언트]
→ /oauth2/authorization/google 요청
↓
[Spring Security (OAuth2LoginFilter)]
→ Google OAuth2 인증 처리
↓
[3. CustomOAuth2UserService]
• Google에서 사용자 정보(email, name 등) 받아옴
• DB에 사용자 정보 저장 (없으면 신규 생성)
• DefaultOAuth2User 반환 (SecurityContext 등록용)
↓
[4. OAuth2SuccessHandler]
• CustomOAuth2UserService로부터 받은 User로 JWT 발급 (AuthService)
• AccessToken → 쿼리 파라미터로 프론트 전달
• RefreshToken → HttpOnly 쿠키로 저장 (7일)
• 클라이언트를 리다이렉트 (프론트에서 AccessToken 수신)
↓
[5. OAuth2FailureHandler]
• 인증 실패 시 401 에러 + JSON 응답 반환
↓
[1. JwtFilter (SecurityConfig 등록)]
• Authorization 헤더 또는 쿼리 파라미터에서 AccessToken 추출
• 블랙리스트/만료/위조 검증 → 유효성 검사
• SecurityContext에 Authentication 등록
↓
[인증 완료 → 보호된 API 접근 가능]
https://accounts.google.com/o/oauth2/auth?...SecurityConfig에 등록된 /oauth2/authorization/google 엔드포인트가 작동.CustomOAuth2UserService)OAuth2User에서 email, name, sub 같은 정보 추출한다.public OAuth2User loadUser(OAuth2UserRequest userRequest) {
OAuth2User oAuth2User = super.loadUser(userRequest);
String email = oAuth2User.getAttribute("email");
...
}
OAuth2AuthenticationSuccessHandler 에서 AccessToken / RefreshToken을 발급한다.OAuth2AuthenticationSuccessHandler 내부에서 AuthService.issueToken() 호출AuthService 내부에서 JwtProvider.createAccessToken() 호출{
"accessToken": "Bearer eyJhbGciOi..."
}
JwtFilter 작동)Authorization: Bearer <AccessToken> 헤더를 전송JwtFilter에서 토큰 파싱 및 검증 후 SecurityContext에 인증 객체 등록String token = jwtProvider.resolveToken(request);
Claims claims = jwtProvider.getClaims(token);
| 항목 | 설명 |
|---|---|
| AccessToken | 15분 등 짧은 유효기간 |
| RefreshToken | 7일 이상, Redis에 저장 |
| 쿠키 | RefreshToken은 HttpOnly + Secure |
| 로그아웃 | Redis에서 RefreshToken 삭제 + 블랙리스트 등록 가능 |
| 재발급 | /auth/reissue 엔드포인트에서 RefreshToken으로 새로운 AccessToken 발급 |
1. [Client] → /oauth2/authorization/google
2. [Spring Security] ← redirect from Google
3. [CustomOAuth2UserService] → 사용자 정보 처리
4. [JwtProvider] → JWT 발급 (Access + Refresh)
5. [Redis] → RefreshToken 저장
6. [Http Response] → AccessToken (JSON), RefreshToken (HttpOnly Cookie)
7. [Client 요청] → Authorization: Bearer <AccessToken>
8. [JwtFilter] → 검증 후 SecurityContext 등록
| 클래스 | 역할 |
|---|---|
SecurityConfig | OAuth2 설정, 필터 등록 |
CustomOAuth2UserService | OAuth2 사용자 정보 매핑 |
OAuth2SuccessHandler | 로그인 성공 시 JWT 발급 및 쿠키 저장 |
JwtProvider | JWT 생성/파싱/검증 |
JwtFilter | 요청 시 토큰 인증 처리 |
AuthController | 토큰 재발급 및 로그아웃 처리 |
RedisTemplate | RefreshToken 저장소 |
이걸 구상하시고 벌써 한달이 지나서 프로젝트가 잘 마무리가 되었네요.
잘 구현해내 주셔서 감사합니다. 고생많으셨어요!