콘텐츠로 이동

[공통] 소셜 로그인 — 네이버 + 카카오 + Apple + 구글

네이버 / 카카오 / Apple / 구글 소셜 로그인 도입 정책. 전체 스토어 공통 적용. WORKSOUT 스토어 선도입 후 각 브랜드 스토어에 순차 적용.


원칙 내용
본인인증 필수 신규 가입 및 기존 계정 연동 시 NICE 본인인증 필수 (네이버·카카오는 소셜 CI 직접 수신 후 NICE 진행, Apple·구글은 NICE 경유로만 CI 수신)
1인 1계정 CI 기준 — 동일 CI로 두 개의 계정 생성 불가
CI 저장 NICE 또는 소셜 CI 수신 즉시 DB 저장. 이후 모든 계정 조회·중복 검사는 CI 기준으로 처리
과도기 호환 CI 도입 이전 가입한 기존 회원은 ci = NULL. 소셜 신규 진입 시 CI로 조회 후 없으면 전화번호로 재조회하는 이중 분기 처리 필요 (CI 확보 시점에 소급 저장)
소셜 가입 비밀번호 소셜로만 가입한 회원은 password = NULL
계정 연속성 소셜 플랫폼 탈퇴 / 연동 해제 시 우리 서비스 계정은 유지
source 기준 진입한 브랜드 기준 (기존 방식 동일)

소셜 로그인 버튼 클릭
→ OAuth 인증 → UID 획득
→ DB에서 UID 일치 계정 조회
→ [일치] → 즉시 로그인

플랫폼별로 CI 획득 경로가 다르다. 두 경로 모두 NICE 이후 과도기 이중 조회 분기를 거친다.

네이버 / 카카오 — 소셜 API에서 CI 직접 수신 후 NICE 진행

UID 없음
→ 약관 동의
카카오: 카카오싱크 동의 화면
네이버: 서비스 자체 약관 동의 화면
→ OAuth 인증 응답에서 소셜 CI 수신
→ 소셜 CI로 기존 계정 1차 조회
[1차 조회: CI 일치 계정 발견] ← CI 있는 기존 회원
→ "이미 가입된 계정이 있습니다" 화면
→ 마스킹 이메일 표시 (예: ab***@email.com)
→ [연동하기] → 소셜 연동 + 로그인 완료 (기존 계정에 CI 소급 저장)
→ [로그인하기] → 현재 소셜 세션 폐기 → 일반 로그인 화면으로 이동
[1차 조회: 없음]
→ NICE 본인인증 → NICE CI 수신
→ NICE CI로 기존 계정 2차 조회 ← 과도기: CI 없는 기존 회원 잡는 단계
[2차 조회: 전화번호 일치 계정 발견] ← CI NULL인 기존 회원
→ "이미 가입된 계정이 있습니다" 화면
→ 마스킹 이메일 표시
→ [연동하기] → 소셜 연동 + 로그인 완료 + 해당 계정에 CI 소급 저장
→ [로그인하기] → 현재 소셜 세션 폐기 → 일반 로그인 화면으로 이동
[2차 조회: 없음] ← 완전 신규
→ 이메일 확인 화면 (소셜 이메일 pre-fill, 미제공 시 직접 입력)
→ [가입하기]
→ 신규 가입 완료 + 로그인 (소셜 CI + NICE CI 모두 저장)

네이버·카카오는 소셜 CI를 먼저 수신해 1차 조회를 한다. 1차에서 못 찾으면 NICE를 진행하고 2차 조회(전화번호 기준)로 CI 없는 기존 회원을 잡는다. CI가 확보되는 시점(연동하기 또는 신규 가입)에 해당 계정에 소급 저장한다.

Apple / 구글 — NICE 경유로만 CI 수신

UID 없음
→ 약관 동의 (서비스 자체 화면)
→ NICE 본인인증 → NICE CI 수신
→ CI로 기존 계정 1차 조회
[1차 조회: CI 일치 계정 발견] ← CI 있는 기존 회원
→ "이미 가입된 계정이 있습니다" 화면
→ 마스킹 이메일 표시 (예: ab***@email.com)
→ [연동하기] → 소셜 연동 + 로그인 완료
→ [로그인하기] → 현재 소셜 세션 폐기 → 일반 로그인 화면으로 이동
[1차 조회: 없음]
→ 전화번호로 기존 계정 2차 조회 ← 과도기: CI NULL인 기존 회원 잡는 단계
[2차 조회: 전화번호 일치 계정 발견] ← CI NULL인 기존 회원
→ "이미 가입된 계정이 있습니다" 화면
→ 마스킹 이메일 표시
→ [연동하기] → 소셜 연동 + 로그인 완료 + 해당 계정에 CI 소급 저장
→ [로그인하기] → 현재 소셜 세션 폐기 → 일반 로그인 화면으로 이동
[2차 조회: 없음] ← 완전 신규
→ 이메일 확인 화면 (소셜 이메일 pre-fill, 미제공 시 직접 입력)
→ [가입하기]
→ 신규 가입 완료 + 로그인 (NICE CI 저장)

Apple·구글은 소셜 API에서 CI를 제공하지 않으므로 NICE CI만 사용한다. 1차 조회(CI 기준) → 2차 조회(전화번호 기준) 순서는 동일하다.

과도기 종료 기준

기존 회원 전체의 ci 필드가 채워진 시점(소급 완료 또는 별도 마이그레이션 배치 실행 후) 2차 조회(전화번호 기준) 분기를 제거하고 CI 단일 조회로 단순화한다. 종료 시점은 개발팀이 판단한다.

필드
password NULL
ci 네이버·카카오: 소셜 CI 우선 저장, NICE 완료 후 NICE CI와 일치 여부 검증 후 최종 저장. Apple·구글: NICE CI 저장
isVerificationNice true
source 진입 브랜드 기준
marketingApproved 약관 동의 화면 선택값
grade MEMBER
platform WEB / IPHONE / ANDROID
name / phone / birthdate / gender NICE 본인인증 결과값

네이버·카카오의 소셜 CI와 NICE CI가 불일치하는 경우(타인 명의 소셜 계정 등) 가입을 차단하고 오류 처리한다. 최종 저장값은 NICE CI로 통일하는 것을 권장한다.


항목 필수/선택
서비스 이용약관 필수
개인정보 처리방침 필수
마케팅 / 광고 수신 동의 선택
항목 사용 여부 비고
id (Unique ID) 연동 식별자
CI 계정 조회·중복 검사 기준. OAuth 응답 수신 즉시 DB 저장
이메일 pre-fill
이름 / 전화번호 / 생년월일 / 성별 참고만 NICE 결과 우선
닉네임 / 프로필이미지 / 연령대 사용 안 함

네이버 CI 수신을 위해 개발자센터에서 “CI(연계정보)” 항목 사용 신청 필요.

우리 서비스에서의 연동 해제는 우리 DB에서만 삭제한다. 각 소셜 플랫폼 앱의 “연결된 서비스 관리”에서는 별도 해제가 필요하며, 이를 간편 로그인 설정 화면에 안내 문구로 표시한다.

password NULL + 남은 소셜 연동 없음
→ "비밀번호를 먼저 설정해야 합니다" 안내
→ 비밀번호 설정 화면으로 강제 이동
password 있거나 다른 소셜 연동 살아있음
→ 바로 해제 가능

네이버 앱에서 직접 연결 해제 시

섹션 제목: “네이버 앱에서 직접 연결 해제 시”
네이버 → Callback URL POST 알림
→ HMAC-SHA256 서명 검증
→ encryptUniqueId 복호화 (AES128/CBC/PKCS5Padding)
→ 해당 유저 연동 정보 삭제 → 204 응답

네이버는 Callback 실패 시 재시도 없음. 로그인 시점에 access token 유효성 체크 후 무효이면 연동 정보 자동 정리하는 보완 로직 필요. 개발자센터에 연결끊기 Callback URL 반드시 등록.

연결 해제 Callback 수신 (동일 엔드포인트)
→ 연동 정보 삭제
→ password NULL인 경우
→ 다음 로그인 시도 시 비밀번호 설정 화면으로 강제 이동
(이메일 발송 없음 — 서비스 접근 시 직접 이동 처리)

우리 서비스 계정은 유지 (네이버 탈퇴 ≠ 우리 서비스 탈퇴)

탈퇴 요청
→ 네이버 /oauth2.0/revoke 호출
→ 실패 시 탈퇴 처리 진행 후 백그라운드 재시도
→ DB 연동 정보 + 회원 정보 탈퇴 상태로 변경
  • 네이버 공식 버튼 가이드 준수. 버튼 텍스트: “네이버로 로그인”

항목 필수/선택
서비스 이용약관 필수
개인정보 처리방침 필수
마케팅 / 광고 수신 동의 선택
카카오톡 채널 추가 동의 선택

카카오싱크 사용 시 비즈 앱 전환 및 심사 필요. 서비스 약관 등록 + 간편가입 활성화 + 카카오톡 채널 연결 필수. 심사 영업일 3~5일.

NICE 본인인증 추가 절차가 있으므로 자동 연결 비활성화, 본인인증 완료 시점에 수동 연결 API 호출.

최초 카카오 로그인 후 24시간 이내 수동 연결 API 미호출 시 카카오가 자동 연결 해제 처리. 다음 로그인 시 처음부터 재진행.

항목 사용 여부 비고
회원번호 (user_id) 연동 식별자
CI 계정 조회·중복 검사 기준. 수동 연결 완료 시점에 DB 저장
이메일 pre-fill
이름 / 전화번호 / 생년월일 / 성별 참고만 NICE 결과 우선. 추가 기능 신청 필요 (심사 영업일 3~5일)
닉네임 / 프로필이미지 / 연령대 사용 안 함

카카오 CI는 카카오싱크 + 이름·전화번호 동의 항목과 함께 신청. CI 단독 수신은 카카오디벨로퍼스 고급 기능 신청 필요 (심사 영업일 3~5일).

네이버와 동일 기준 적용. 우리 서비스에서의 해제는 우리 DB 삭제만 처리하며, 카카오 앱 “연결된 서비스 관리”에서의 완전 해제는 사용자가 직접 진행해야 함을 화면에 안내한다.

카카오 앱에서 직접 연결 해제 시

섹션 제목: “카카오 앱에서 직접 연결 해제 시”
카카오 → 연결 해제 웹훅 수신
→ 웹훅 서명 검증 → 연동 정보 삭제 → 200 응답

웹훅은 연결 해제 웹훅 + 계정 상태 변경 웹훅 두 가지 모두 등록 필요. 카카오디벨로퍼스 > 앱 설정 > 카카오 로그인 > 웹훅 URL 등록.

카카오 → 연결 해제 웹훅 수신 (동일 엔드포인트)
→ 연동 정보 삭제
→ password NULL인 경우
→ 다음 로그인 시도 시 비밀번호 설정 화면으로 강제 이동
(이메일 발송 없음 — 서비스 접근 시 직접 이동 처리)

우리 서비스 계정은 유지 (카카오 탈퇴 ≠ 우리 서비스 탈퇴)

탈퇴 요청
→ 카카오 연결 해제 API 호출 (필수 — 미호출 시 카카오 정책 위반)
→ 실패 시 탈퇴 처리 진행 후 백그라운드 재시도
→ DB 회원 정보 탈퇴 상태로 변경
  • 카카오 공식 버튼 가이드 준수. 버튼 텍스트: “카카오로 시작하기”, 버튼 색상: #FEE500

네이버와 동일 방식. 서비스 자체 화면에서 직접 수집.

항목 필수/선택
서비스 이용약관 필수
개인정보 처리방침 필수
마케팅 / 광고 수신 동의 선택
항목 사용 여부 비고
user identifier (sub) 연동 식별자
CI NICE 본인인증 경유 수신. NICE 완료 즉시 DB 저장
이메일 pre-fill. 최초 1회만 제공 — 첫 OAuth 응답에서 즉시 저장 필수
이름 / 전화번호 / 생년월일 / 성별 참고만 NICE 결과 우선. 이름도 최초 1회만 제공

Private Relay 이메일: 사용자가 “이메일 가리기” 선택 시 abc123@privaterelay.appleid.com 형태로 전달됨. 이 주소로 이메일 발송 시 Apple에 발신 도메인 등록 필수. Apple Developer → Certificates → More → Configure (Sign in with Apple for Email Communication). 미등록 시 모든 이메일 차단.

네이버/카카오와 동일 기준 적용. 우리 서비스에서의 해제는 우리 DB 삭제만 처리하며, iPhone 설정 “Apple 계정을 사용하는 앱”에서의 완전 해제는 사용자가 직접 진행해야 함을 화면에 안내한다.

Apple ID 설정에서 직접 연결 해제 시

섹션 제목: “Apple ID 설정에서 직접 연결 해제 시”
iPhone 설정 > Apple 계정 > 암호 및 보안 > Apple 계정을 사용하는 앱에서 연결 해제
→ Apple이 Server to Server Notification (consent-revoked 이벤트) 전송
→ JWT 서명 검증 (Apple 공개키 사용)
→ 해당 유저 연동 정보 삭제 → 200 응답

Apple Server to Server Notification 이벤트: consent-revoked (직접 연결 해제), account-delete (Apple ID 삭제), email-disabled (Private Relay 비활성화)

Apple → account-delete 이벤트 전송 (동일 엔드포인트)
→ 연동 정보 삭제
→ password NULL인 경우
→ 다음 로그인 시도 시 비밀번호 설정 화면으로 강제 이동
(이메일 발송 없음 — 서비스 접근 시 직접 이동 처리)

우리 서비스 계정은 유지 (Apple ID 삭제 ≠ 우리 서비스 탈퇴)

탈퇴 요청
→ Apple /auth/revoke 호출
→ 실패 시 탈퇴 처리 진행 후 백그라운드 재시도
→ DB 연동 정보 + 회원 정보 탈퇴 상태로 변경

카카오와 달리 Apple은 미완료 건을 자동 해제해주지 않음. 서비스가 직접 관리.

NICE 인증 중 이탈한 사용자
→ Apple token이 미완성 상태로 DB에 남음
→ 배치 작업으로 일정 시간 경과한 미완료 건 정리
→ 해당 사용자가 다시 Apple 로그인 시도 시 처음부터 재진행

Apple의 Client Secret은 고정값이 아니라 ES256 Private Key로 직접 JWT를 생성해야 하며 최대 유효기간 6개월.

Client Secret JWT가 만료되면 Apple 로그인 전체가 불능 상태가 됨. 만료 30일 전 알림 또는 자동 갱신 로직 반드시 구현 필요.

  • 앱에 다른 소셜 로그인(네이버, 카카오)이 있으면 Apple 로그인도 반드시 제공해야 함 (App Store 심사 정책 강제)
  • 웹 전용 서비스는 강제 아님
  • Apple 버튼이 다른 소셜 버튼보다 작으면 안 됨
항목 규칙
버튼 텍스트 “Apple로 로그인” / “Apple로 등록” / “Apple로 계속하기” 세 가지만 허용
버튼 색상 흰색, 윤곽 있는 흰색, 검은색 세 가지만 허용
버튼 크기 최소 너비 140pt, 최소 높이 30pt. 다른 소셜 버튼보다 작으면 안 됨
로고 Apple 공식 아트워크만 사용. 사용자 설정 로고 생성 불가
버튼 위치 스크롤 없이 보여야 함

플랫폼 구글 로그인 제공 여부
Android ✅ (Credential Manager API)
iOS ❌ 미구현

네이버 / Apple과 동일 방식. 서비스 자체 화면에서 직접 수집.

항목 필수/선택
서비스 이용약관 필수
개인정보 처리방침 필수
마케팅 / 광고 수신 동의 선택
항목 사용 여부 비고
sub (Google UID) 연동 식별자. ID Token의 sub claim 사용. getId() 반환값 직접 전송 금지
CI NICE 본인인증 경유 수신. NICE 완료 즉시 DB 저장
이메일 pre-fill
이름 / 전화번호 / 생년월일 / 성별 참고만 NICE 결과 우선

구글 계정의 이메일 주소는 변경될 수 있으므로 사용자 식별에 이메일 사용 금지. 식별자는 반드시 ID Token의 sub claim 사용.

네이버/카카오/Apple과 동일 기준 적용. 우리 서비스에서의 해제는 우리 DB 삭제만 처리하며, Google 계정 설정 “서드파티 앱 접근”에서의 완전 해제는 사용자가 직접 진행해야 함을 화면에 안내한다.

Google 계정 설정에서 직접 연결 해제 시

섹션 제목: “Google 계정 설정에서 직접 연결 해제 시”
사용자가 Google 계정 설정에서 앱 연결 해제
→ RISC Cross-Account Protection 이벤트 수신
(이벤트 타입: sessions-revoked 또는 token-revoked)
→ accounts.google.com/.well-known/risc-configuration에서 issuer·jwks_uri 취득 → 서명 검증
→ 해당 유저 연동 정보 삭제 → 200 응답

RISC 옵트인 필수: Google RISC는 기본으로 수신되지 않으며 사전 구독(옵트인) 설정 필요. 미설정 시 외부 연결 해제 감지 불가. Google Cloud Console에서 RISC API 활성화 후 이벤트 수신 엔드포인트 등록 필요.

구글 계정 삭제
→ RISC account-disabled 이벤트 수신 (동일 엔드포인트)
→ 연동 정보 삭제
→ password NULL인 경우
→ 다음 로그인 시도 시 비밀번호 설정 화면으로 강제 이동
(이메일 발송 없음 — 서비스 접근 시 직접 이동 처리)

우리 서비스 계정은 유지 (구글 계정 삭제 ≠ 우리 서비스 탈퇴)

탈퇴 요청
→ POST https://oauth2.googleapis.com/revoke
Content-Type: application/x-www-form-urlencoded, token={access_token 또는 refresh_token}
→ 실패 시 탈퇴 처리 진행 후 백그라운드 재시도
→ DB 연동 정보 + 회원 정보 탈퇴 상태로 변경
UI 방식 설명
Bottom Sheet Credential Manager 내장 UI. 패스키·비밀번호와 통합. Automatic Sign-In 지원. 닫으면 재시도 불가
버튼 (Sign in with Google) 화면 내 고정 버튼. Bottom sheet 닫은 후 재시도 가능. 기기에 구글 계정 없을 때도 작동

Android 앱에서는 두 가지 모두 구현.

항목 규칙
버튼 텍스트 “Sign in with Google” / “Sign up with Google” / “Continue with Google” (서비스 언어에 맞게 로컬라이징 권장)
로고 Google “G” 로고 크기·색상 변경 불가
버튼 배경 흰색 배경
권장 구현 Google Identity Services SDK 렌더링 버튼 사용 시 최신 가이드라인 자동 준수

한 계정에 네이버 / 카카오 / Apple / 구글 / 이메일 다섯 가지 로그인 수단을 모두 보유할 수 있음. 마이페이지에서 각 플랫폼 연동 토글을 각각 분리하여 관리.

  • 구글: 웹 + Android에만 표시
  • Apple: 웹 + iOS에만 표시
상황 강제 여부
password NULL + 남은 소셜 연동 없음 ✅ 강제 → 비밀번호 설정 화면으로 이동
password NULL + 다른 소셜 연동 살아있음
password 있음

구글은 웹+Android, Apple은 웹+iOS 기준 표시. 플랫폼에 따라 노출 여부가 다름.

password 네이버 카카오 Apple 구글 가능한 로그인 수단 강제 설정
NULL 네이버, 카카오, Apple, 구글 마지막 연동 해제 시
NULL 네이버, 카카오 마지막 연동 해제 시
NULL 네이버 네이버 해제 시
NULL 카카오 카카오 해제 시
NULL Apple Apple 해제 시
NULL 구글 구글 해제 시
NULL 없음 (발생 불가 — 해제 전 강제 설정)
있음 any any any any 이메일 + 연동된 소셜 없음
연동 상태 처리
카카오만 카카오 연결 해제 API → 탈퇴
네이버만 네이버 /oauth2.0/revoke → 탈퇴
Apple만 Apple /auth/revoke → 탈퇴
구글만 Google oauth2.googleapis.com/revoke → 탈퇴
복수 연동 연동된 모든 플랫폼 API 호출 → 탈퇴. 실패 API 백그라운드 재시도
미연동 API 호출 없이 바로 탈퇴

시나리오 예시: 두 개 연동 후 순서대로 해제

섹션 제목: “시나리오 예시: 두 개 연동 후 순서대로 해제”
첫 번째 해제 (예: 카카오, 다른 연동 살아있음)
→ 해당 플랫폼 연결 해제 API 호출 → 바로 해제 완료
두 번째 해제 (마지막 연동)
→ password NULL + 남은 소셜 연동 없음
→ "비밀번호를 먼저 설정해야 합니다" 강제 안내
→ 비밀번호 설정 완료 후 해제 가능

시나리오 예시: 소셜 플랫폼 외부에서 연결 해제 (두 개 연동 상태)

섹션 제목: “시나리오 예시: 소셜 플랫폼 외부에서 연결 해제 (두 개 연동 상태)”
카카오 앱에서 직접 연결 해제
→ 카카오 웹훅 수신 → 카카오 연동 정보만 삭제
→ 네이버 연동 살아있음 → 로그인 수단 있음, 별도 처리 없음
카카오 + 네이버 모두 외부에서 해제된 상태
→ 다음 서비스 접근 시 비밀번호 설정 화면으로 강제 이동

화면 설명
로그인 네이버 / 카카오 / Apple(웹+iOS) / 구글(웹+Android) 버튼 추가. Apple은 다른 소셜 버튼보다 작으면 안 됨
약관 동의 (네이버 · Apple · 구글 공통) 카카오는 카카오싱크에서 처리. 나머지 3개 플랫폼은 서비스 자체 화면
이메일 확인 (신규 가입) 소셜 이메일 pre-fill. Apple Private Relay 주소도 pre-fill. 미제공 시 직접 입력
기존 계정 발견 마스킹 이메일 + [연동하기] / [로그인하기]
간편 로그인 설정 (마이페이지) 진입 시 비밀번호 입력 확인 필수 (password NULL인 경우 현재 연동된 소셜로 본인 확인). 네이버 / 카카오 / Apple(iOS에서만) / 구글(Android·웹에서만) 연동 토글 각각 분리. 각 토글 하단에 “완전한 연결 해제는 [플랫폼명] 앱 > 연결된 서비스 관리에서 직접 해제가 필요합니다” 안내 문구 표시
비밀번호 설정 마지막 연동 해제 시도 / 소셜 플랫폼 탈퇴 후 서비스 접근 시 / 직접 설정 원하는 경우 공통 진입

항목 내용
code 내부 회원코드 자동 생성 규칙 개발팀 확인 필요
개인정보 보관 기간 탈퇴 후 보관 기간 정책 결정 필요
카카오싱크 비즈니스 심사 일정 확인 필요
카카오톡 채널 연결 확인 간편가입 활성화 필수 조건
구글 브랜드 인증(Brand Verification) 심사 일정 미완료 시 동의 화면에 앱 이름 표시 안 됨
마이페이지 간편 로그인 화면 플랫폼별 노출 조건 iOS: Apple 표시 / Android: 구글 표시 / 웹: 전체 표시

버전 날짜 변경 내용
v1.5 2026-07-06 연동 해제 정책: 우리 서비스는 DB만 삭제, 완전 해제는 각 플랫폼 앱에서 직접 진행 안내 문구 명시. 간편 로그인 설정 화면 진입 시 비밀번호 확인 필수 추가
v1.4 2026-07-06 과도기 이중 조회 분기 추가 (CI 없는 기존 회원 → 전화번호 2차 조회 후 CI 소급 저장). 소셜 CI·NICE CI 불일치 시 차단 정책 명시. 로그인 수단 상태별 요약에 구글 열 추가. 과도기 종료 기준 명시
v1.3 2026-07-06 CI 기반 계정 관리 정책 추가. 1인 1계정 기준 전화번호 → CI 변경. 네이버·카카오 소셜 CI 직접 수신 / Apple·구글 NICE 경유 CI 수신 플로우 분리. 신규 가입 설정값에 ci 필드 추가
v1.2 2026-07-02 소셜 플랫폼 탈퇴 시 이메일 발송 완전 제거. 모든 케이스 → 다음 서비스 접근 시 비밀번호 설정 화면 강제 이동으로 통일
v1.1 2026-07-02 Apple / 구글 로그인 정책 추가. 복합 연동 시나리오 확장. 플랫폼별 노출 조건 정의
v1.0 2026-07-02 최초 작성. 소셜 플랫폼 탈퇴 시 이메일 발송 제거 → 비밀번호 설정 화면 직접 이동으로 변경