Skip to content

Conversation

@DDINGJOO
Copy link
Owner

목적

카카오와 애플 소셜 로그인 기능을 구현하여 사용자가 간편하게 로그인할 수 있도록 합니다.

구현 내용

1. OAuth 클라이언트

KakaoOAuthClient

  • 카카오 사용자 정보 API 호출
  • Access Token으로 사용자 이메일 조회
  • 에러 처리 및 로깅

AppleOAuthClient

  • Apple Identity Token JWT 파싱
  • Base64 디코딩 및 Claim 추출
  • 이메일 및 sub 정보 검증

2. 소셜 로그인 서비스

SocialLoginService

  • 카카오/애플 통합 로그인 처리
  • 신규 사용자 자동 회원가입
  • 기존 사용자 로그인
  • Provider 불일치 검증 (동일 이메일 다른 Provider 차단)

3. 컨트롤러 및 DTO

SocialLoginController

  • POST /api/auth/social/kakao
  • POST /api/auth/social/apple

DTO

  • SocialLoginRequest: accessToken, deviceId
  • KakaoUserInfo: 카카오 사용자 정보
  • AppleUserInfo: 애플 사용자 정보

4. LoginService 개선

  • generateLoginResponse 메서드 추가
    • 소셜 로그인에서 재사용 가능
    • deviceId 파라미터 지원
    • deviceId 미제공 시 자동 생성

5. 설정 및 인프라

  • RestTemplateConfig: HTTP 클라이언트 Bean 설정
  • application-dev.yaml: OAuth URI 설정
  • ErrorCode 추가: SOCIAL_LOGIN_FAILED

주요 파일/모듈

src/main/java/com/teambiund/bander/auth_server/
├── client/oauth/
│   ├── KakaoOAuthClient.java (신규)
│   └── AppleOAuthClient.java (신규)
├── controller/
│   └── SocialLoginController.java (신규)
├── dto/
│   ├── request/SocialLoginRequest.java (신규)
│   └── response/
│       ├── KakaoUserInfo.java (신규)
│       └── AppleUserInfo.java (신규)
├── service/
│   ├── social/SocialLoginService.java (신규)
│   └── login/
│       ├── LoginService.java (수정)
│       └── LoginServiceImpl.java (수정)
├── config/RestTemplateConfig.java (신규)
└── exceptions/ErrorCode/ErrorCode.java (수정)

docs/SOCIAL_LOGIN_SETUP.md (신규)
src/main/resources/application-dev.yaml (수정)

로그인 흐름

  1. 클라이언트가 카카오/애플 SDK를 통해 Access Token 또는 Identity Token 획득
  2. Auth Server에 Token과 함께 로그인 요청
  3. OAuth 클라이언트가 해당 플랫폼 API로 사용자 정보 조회
  4. 이메일 기반으로 기존 사용자 확인
    • 신규 사용자: SignupService.signupFromOtherProvider 호출
    • 기존 사용자: Provider 일치 여부 확인
  5. LoginService.generateLoginResponse로 JWT Token 발급

API 명세

카카오 로그인

POST /api/auth/social/kakao
Content-Type: application/json

{
  "accessToken": "카카오 Access Token",
  "deviceId": "optional-device-id"
}

Response:

{
  "accessToken": "JWT Access Token",
  "refreshToken": "JWT Refresh Token",
  "deviceId": "device-id"
}

애플 로그인

POST /api/auth/social/apple
Content-Type: application/json

{
  "accessToken": "애플 Identity Token (JWT)",
  "deviceId": "optional-device-id"
}

Response:

{
  "accessToken": "JWT Access Token",
  "refreshToken": "JWT Refresh Token",
  "deviceId": "device-id"
}

수용 기준 검증

  • 카카오 OAuth 클라이언트 구현
  • 애플 OAuth 클라이언트 구현
  • 소셜 로그인 서비스 구현
  • 컨트롤러 엔드포인트 구현
  • Provider 불일치 검증
  • 신규 사용자 자동 회원가입
  • 기존 테스트 전체 통과
  • 빌드 성공
  • 설정 문서 작성

테스트

빌드 및 테스트 결과

./gradlew build
BUILD SUCCESSFUL

./gradlew test
BUILD SUCCESSFUL
전체 테스트 통과

수동 테스트 방법

카카오 로그인 테스트

# 1. 카카오 SDK로 Access Token 획득 (클라이언트)
# 2. Auth Server 호출
curl -X POST http://localhost:8000/api/auth/social/kakao \
  -H 'Content-Type: application/json' \
  -d '{
    "accessToken": "{카카오 Access Token}",
    "deviceId": "test-device"
  }'

애플 로그인 테스트

# 1. 애플 SDK로 Identity Token 획득 (클라이언트)
# 2. Auth Server 호출
curl -X POST http://localhost:8000/api/auth/social/apple \
  -H 'Content-Type: application/json' \
  -d '{
    "accessToken": "{애플 Identity Token}",
    "deviceId": "test-device"
  }'

Provider 정책

중복 가입 방지

  • 동일한 이메일로 다른 Provider 가입 불가
  • 예: [email protected]으로 카카오 가입 후, 동일 이메일로 애플 가입 시도 시 EMAIL_ALREADY_EXISTS 에러

신규 사용자 처리

  • Provider와 이메일만 저장
  • 비밀번호 저장 안 함
  • 자동으로 SYSTEM이 아닌 해당 Provider로 설정
  • 프로필 생성 이벤트 자동 발행

브레이킹/마이그레이션

Breaking Change: 없음

새로운 기능 추가이므로 기존 기능에 영향 없음

설정 가이드

자세한 설정 방법은 docs/SOCIAL_LOGIN_SETUP.md 참조

카카오 설정 요약

  1. Kakao Developers에서 애플리케이션 등록
  2. 카카오 로그인 활성화
  3. 이메일 동의항목 필수로 설정
  4. REST API 키를 클라이언트에 제공

애플 설정 요약

  1. Apple Developer에서 App ID 및 Services ID 등록
  2. Sign in with Apple 활성화
  3. Domains and Return URLs 설정
  4. Key 생성 및 다운로드

코드 강점

1. 확장 가능한 구조

  • OAuth 클라이언트를 독립적으로 분리
  • 새로운 소셜 로그인 Provider 추가 용이
  • SocialLoginService에서 통합 처리

2. 에러 처리

  • 각 OAuth 클라이언트에서 명확한 에러 로깅
  • 사용자 정보 누락 시 적절한 예외 처리
  • Provider 불일치 시 명확한 에러 메시지

3. 재사용성

  • LoginService.generateLoginResponse를 소셜 로그인에서도 재사용
  • deviceId 자동 생성 로직 공통화

4. 문서화

  • 설정 가이드 완비
  • API 명세 및 예제 제공
  • 트러블슈팅 가이드 포함

참조

체크리스트

  • 빌드 성공
  • 모든 테스트 통과
  • API 문서 작성
  • 설정 가이드 작성
  • 코드 리뷰 준비 완료

- KakaoOAuthClient: 카카오 사용자 정보 조회
- AppleOAuthClient: 애플 Identity Token 파싱
- SocialLoginService: 통합 소셜 로그인 처리
- SocialLoginController: 카카오/애플 로그인 엔드포인트
- LoginService.generateLoginResponse 추가
- ErrorCode.SOCIAL_LOGIN_FAILED 추가
- 소셜 로그인 설정 문서 작성 (docs/SOCIAL_LOGIN_SETUP.md)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants