카카오·구글·애플 OAuth 기반 인증/인가 기능 구현 - #15
Conversation
리뷰 코멘트구조는 잘 잡혀 있습니다. 패키지 레이아웃, 다만 토큰 설계 쪽에 머지 전에 봐야 할 부분이 몇 개 있어서 정리했습니다. P0 — 머지 전 수정 제안1. Refresh Token을 Access Token으로 쓸 수 있습니다
// createToken에 typ 클레임 추가 → 필터는 access만, ReissueAuthService는 refresh만 통과
.claim("typ", "access")2.
fun getJti(token: String): String? = claims(token).id
// 필터: ?.takeUnless { t -> getJti(t)?.let(blacklist::isBlacklisted) ?: false }3. 같은 이메일 + 다른 provider → 500 V2의 4. 탈퇴해도 다른 기기의 Access Token이 최대 1시간 유효
P1 — 확인 부탁드립니다5. V3 마이그레이션이 기존 row 있으면 실패합니다
6. Redis String 직렬화가 검증되지 않았습니다
7. 필수 필드 누락 요청이 400이 아니라 500
8. provider 호출 실패 원인이 전부 소실됩니다 3개 Strategy 모두 P2 — 설계 판단이 필요한 부분
P3 — 정리 제안 (선택)
테스트는 서비스·전략·컨트롤러 레이어를 MockK + |
…wal grace period
…med request bodies
|
리뷰 감사합니다. 전부 확인해서 4개 커밋으로 나눠 반영했습니다. P0
P1
P2 (하민과 논의 후 결정)
P3
전체 테스트( |
✨ 작업 내용
Kakao/Google/Apple OAuth 인가코드 방식 기반의 인증/인가 도메인을 신규 구현하였습니다.
POST /api/v1/auth/oauth/{provider}: 인가코드를 provider 토큰 엔드포인트와 교환하여 로그인 처리, 신규/기존 회원을 판별하여 응답POST /api/v1/auth/signup: 최초 로그인 시 생성된 미완성 회원 정보(이름/닉네임/성별/나이)를 완성PATCH /api/v1/auth/reissue: Refresh Token 검증 및 Rotation 방식으로 재발급DELETE /api/v1/auth/signout: Redis 기반 Access Token 블랙리스트 등록 및 Refresh Token 폐기DELETE /api/v1/auth/withdraw: 회원 Soft Delete 및 개인정보 익명화 처리OAuthStrategy전략 패턴으로 Kakao/Google/Apple 인가코드 교환 로직을 분리하였고, Apple의 client_secret은 ES256 서명 JWT로 즉석 생성하도록 구현하였습니다.Member엔티티에oauthProvider,providerId,gender,age,withdrawnAt필드를 추가하고 Flyway 마이그레이션(V3)을 작성하였습니다.🔍 리뷰 시 참고사항
Memberrow를 즉시 생성하고 실제 Access/Refresh Token을 발급합니다./signup은 이미 발급된 토큰으로 인증된 상태에서 프로필을 완성하는 구조라, 응답 바디 없이 201만 반환해도 클라이언트가 들고 있는 토큰이 그대로 유효합니다./oauth/{provider}응답에isNewMember필드를 추가하였습니다. 신규/기존 회원 판별 없이는 클라이언트가 회원가입 화면으로의 분기를 할 수 없어 추가한 필드입니다./reissue만Authorization이 아닌refreshToken이라는 커스텀 헤더를 사용합니다 (refreshToken: Bearer ey...).JwtTokenProvider에 jti 클레임과getRemainingValidity()를 추가하였습니다.Apple개발자 계정 발급 전이라OAUTH_APPLE_*환경변수는 아직 실제 값으로 검증되지 않았습니다. 나머지는 로컬에서 Kakao/Google 실제 콘솔 값으로 기동 및 API 응답까지 확인하였습니다.✅ 체크리스트
.env.example등) 변경이 필요한 경우 작성 또는 수정했나요?📎 관련 이슈(선택)