이번에는 소셜[카카오(Kakao)와 애플(Apple)] 로그인을 실제로 구현하면서 겪은 과정들을 정리해본다.
왜 이 글을 쓰게 되었는지
사실 카카오 로그인만 붙이면 참 편했을 거다. 한국에서는 국민 앱이니까. 하지만 Apple App Store 심사 지침(Guideline 4.8)이 발목을 잡았다. 타사 소셜 로그인(구글, 카카오 등)을 쓰려면 반드시 ‘Sign in with Apple’도 같이 넣어야 한다는 조항 때문이다. 결국 울며 겨자 먹기로 두 가지를 다 구현하게 되었는데, 이 과정에서 꽤나 헤맸던 포인트들이 있어 기록해둔다.
1. 카카오 로그인: 이메일정보 수신은 비즈앱 인증 필요
카카오 로그인은 워낙 레퍼런스가 많아서 쉬울 줄 알았다. 하지만 이메일 정보 수집에서 바로 막혔다.
문제 상황
사용자의 이메일을 DB에 저장해서 식별자로 쓰고 싶었는데, 카카오 개발자 센터에서 이메일 항목이 ‘선택’으로만 설정되고 ‘필수’로 안 바뀌는 것이었다. 알고 보니 ‘검수’가 필요하거나, 비즈 앱(Biz App)으로 전환해야만 이메일을 필수/제한 없이 받을 수 있었다.
해결: 비즈 앱 전환
결국 사업자등록번호를 입력하고 비즈 앱으로 전환한 뒤에야 이메일을 제대로 받을 수 있었다. 혹시나 개인 프로젝트나 사이드 프로젝트로 하시는 분들은 이 부분을 미리 체크해야 한다. (사업자 없으면 이메일은 포기하거나 선택적으로 받아야 한다.)
구현 흐름
Spring Security OAuth2 Client가 편하긴 한데, 앱(App)과 웹(Web)을 동시에 지원하려다 보니 AccessToken을 프론트에서 받아 서버로 넘기는 방식을 택했다.
- Frontend: 카카오 SDK로 로그인 ->
Access Token획득 -> 백엔드로 전송 - Backend: 받은 토큰으로 카카오 API (
/user/me) 호출 -> 사용자 정보 획득 -> JWT 발급
(일반적인 OAuth2 Code Flow랑은 조금 다르지만, 모바일 앱 환경에서는 이게 더 직관적이었다.)
2. 애플 로그인
애플 로그인은 카카오랑 달라도 너무 다르다. 가장 큰 차이점은 Access Token으로 정보를 줘야지 않고, Identity Token (JWT)을 던져준다는 것이다.
구현 흐름의 차이
- 카카오: “토큰 줄게, 이걸로 API 찔러봐.” (Opaque Token에 가까운 활용)
- 애플: “내 서명이 담긴 보증서(JWT)야. 이거 까보면 정보 들어있어.” (OIDC 표준)
그래서 애플 로그인은 별도의 API 호출 없이, 프론트에서 받은 identityToken을 서버에서 자체 검증(Verify) 하는 과정이 핵심이다.
검증 로직 구현 (RSA PublicKey)
애플이 서명한 토큰을 검증하려면 애플의 공개키(Public Key)가 필요하다. https://appleid.apple.com/auth/keys 이 주소에 가면 공개키 목록을 주는데, 이걸 매번 요청하면 느리다. 그래서 **캐싱(Caching)**이 필수다.
// Apple ID Token 검증 로직 (간소화)
public Claims verifyIdentityToken(String identityToken) {
// 1. 헤더에서 'kid' 꺼내기
// 2. 애플 공개키 목록에서 해당 kids와 일치하는 키 찾기 (캐싱된 것 사용)
// 3. RSA로 서명 검증 (nimbus-jose-jwt 라이브러리 추천)
// 4. iss, aud, exp 클레임 체크
return claims;
}
주의할 점: 이메일은 단 한 번뿐
애플 로그인을 테스트하다가 DB를 날리고 다시 로그인했는데, 이메일이랑 이름이 안 들어왔다. 알고 보니 애플은 개인정보 보호 정책상 “최초 가입 시 딱 한 번만” 사용자의 이름과 이메일을 user 객체로 따로 내려준다. (토큰 안에도 이메일은 있을 수 있지만, 이름은 진짜 이때만 준다.) 그러니 처음 받을 때 DB에 무조건 잘 저장해야 한다. 놓치면? 사용자가 설정 가서 ‘Apple ID 사용 중단’ 하고 다시 해야 한다. (진짜 불편하다.)
3. 요약 및 비교 (카카오 vs 애플)
| 구분 | 카카오 (Kakao) | 애플 (Apple) |
|---|---|---|
| 방식 | Access Token으로 API 호출 | Identity Token (JWT) 자체 검증 |
| 식별자 | id (Long 숫자) | sub (String, 엄청 김) |
| 이메일 | 비즈 앱 아니면 받기 힘듦 | 최초 1회만 별도 제공 (주의!) |
| 난이도 | 하 (레퍼런스 부자) | 상 (JWT 파싱, 키 관리 등 복잡) |
마무리
일단 카카오/애플 로그인 이 두 트랙으로 회원가입을 진행하려한다 특히 애플 로그인은 백엔드에서 공개키 검증 로직 짜는 게 은근히 까다로우니, jjwt나 nimbus 같은 라이브러리를 잘 활용하는 걸 추천한다.
다음 글에서는 이렇게 구축한 백엔드 서버를 실제 모바일 앱(iOS/Android)과 연동하여 로그인 기능을 완성하는 과정을 다뤄볼 예정이다. 실제 앱에서는 과정이 어떻게 흐르는지 보여드리겠다.