본문 바로가기메인 메뉴 바로가기사이드 메뉴 바로가기

kakao developers

관련사이트
  • 문서
  • 카카오 로그인
  • 웹훅

사이드 메뉴

카카오맵

검색

이 문서는 카카오 로그인 웹훅 기능을 안내합니다.

웹훅(Webhook)은 카카오 로그인 사용자의 계정 상태에 변경 사항이 생겼을 때, 카카오디벨로퍼스에 설정된 웹훅 URL로 HTTP 요청을 보내 서비스에게 공유하는 기능입니다.

카카오 로그인 관련 웹훅은 OpenID 재단에서 개발 및 제공하는 Shared Signals and Events Framework(SSF) 규격을 바탕으로 설계됐으며, 일부 이벤트는 카카오에서 직접 정의하여 제공합니다.

이 문서는 서비스에서 카카오 API를 호출하는 방식이 아닌, 카카오가 서비스의 엔드포인트로 전송하는 웹훅 요청에 대한 명세를 설명합니다.

웹훅 기능의 전체 흐름과 구현 방식은 구현 절차에서 먼저 확인할 수 있습니다.

메서드URL필수 응답 규격인증 방식
GET/POST앱 관리 페이지의 [앱] > [웹훅] > [연결 해제 웹훅]에 등록한 웹훅 URLHTTP 상태 코드 200 OK (3초 내)대표 어드민 키

연결 해제 웹훅은 사용자가 서비스 외부에서 앱과 연결을 끊은 경우, 카카오가 해당 사실을 서비스로 전달하는 기능입니다.

웹훅을 수신한 서비스는 내부 정책에 따라 사용자 정보를 처리한 뒤, HTTP 상태 코드 200 OK로 3초 내에 응답해야 합니다. 사용자 정보가 없거나 오류 발생 시에도 200 OK으로 응답해야 합니다.

웹훅 기능을 구현하는 방법은 구현 절차를 참고합니다.

아래 상황이 발생한 경우 연결 해제 웹훅을 발송합니다. 서비스가 연결 해제 API를 호출해 앱과 사용자의 연결을 끊은 경우에는 연결 해제 웹훅을 발송하지 않습니다.

이름설명필수
AuthorizationAuthorization: KakaoAK ${PRIMARY_ADMIN_KEY}
인증 방식, 대표 어드민 키로 인증 요청
O
이름타입설명필수
app_idString사용자가 연결 해제를 요청한 서비스 앱 IDO
user_idString연결 해제를 요청한 사용자의 회원번호O
referrer_typeString연결 해제 요청 경로
  • ACCOUNT_DELETE: 카카오계정 탈퇴
  • FORCED_ACCOUNT_DELETE: 장기 휴면 또는 고객센터에서 카카오계정 강제 탈퇴
  • UNLINK_FROM_ADMIN: 카카오 관리자로 인한 탈퇴 처리
  • UNLINK_FROM_APPS: 카카오계정 페이지에서 서비스 연결 해제
  • INCOMPLETE_SIGN_UP: 가입 미완료 사용자 연결 해제 처리(공지사항 참고)
O
group_user_tokenString연결 해제를 요청한 사용자의 그룹 사용자 토큰, 연결 해제가 발생한 앱이 그룹앱인 경우에만 제공X

웹훅 요청을 받은 후 3초 내에 HTTP 상태 코드 200 OK로 응답해야 합니다.

아래는 사용자가 서비스 외부에서 연결을 끊을 때 카카오가 서비스에게 보내는 웹훅 요청 예시입니다.

curl -v -G GET "${UNLINK_CALLBACK_URL}?app_id=${APP_ID}&user_id=${USER_ID}&referrer_type=UNLINK_FROM_APPS" \
-H "Authorization: KakaoAK ${PRIMARY_ADMIN_KEY}"
curl -v -X POST "${UNLINK_CALLBACK_URL}" \
-H "Authorization: KakaoAK ${PRIMARY_ADMIN_KEY}" \
--data-urlencode "app_id=${APP_ID}" \
--data-urlencode "user_id=${USER_ID}" \
--data-urlencode "referrer_type=UNLINK_FROM_APPS"

서비스의 엔드포인트에서 카카오에게 응답해야 할 응답 예시입니다.

HTTP/1.1 200 OK
메서드URL필수 응답 규격인증 방식
POST앱 관리 페이지의 [카카오 로그인] > [계정 상태 변경 웹훅]에 등록한 웹훅 URLSET 검증 결과별 규격으로 3초 내에 응답
  • 성공 시: HTTP 상태 코드 202 Accepted
  • 실패 시: HTTP 상태 코드 400 Bad Request와 지정 헤더 및 본문(참고)
대표 REST API 키
권한사전 설정카카오 로그인동의항목
-REST API 키
카카오 로그인 활성화
계정 상태 변경 웹훅
필요CAEP, RISC 사용 시 필수:
카카오계정 상태 변경 내역

계정 상태 변경 웹훅은 사용자의 계정 상태가 바뀔 때마다 이벤트 정보를 지정한 웹훅 URL로 전송하는 기능입니다.

구현 방법은 구현 절차를 참고합니다.

웹훅 응답 주의 사항

  • 웹훅 요청을 받은 서비스는 이벤트 처리 결과를 반드시 성공 또는 검증 실패 규격에 맞게 응답해야 합니다.
  • 응답이 전달되지 않거나, 검증실패 응답 규격에 맞지 않는 응답이 전달될 경우, 카카오는 웹훅 발송 실패로 판단하여 재전송을 시도합니다.
  • 연속적인 전송 실패 시 웹훅이 비활성화 처리될 수 있습니다.

지원하는 카테고리별 이벤트는 아래와 같습니다. [이벤트 타입] 열의 이름을 선택하면 해당 이벤트의 상세 정보에서 이벤트 페이로드를 확인할 수 있습니다.

카테고리설명이벤트 타입
OAUTH
  • OAuth 2.0 프로토콜과 관련된 계정 상태 변경 이벤트 타입
  • OpenID 재단의 OAUTH 규격 사용
  • 카카오 로그인 사용자의 앱 연결 및 해제, 동의항목 동의 및 철회, 비즈니스 토큰 발급 및 철회 시 웹훅 전송
Tokens Revoked
User Linked
User Unlinked
User Scope Consent
User Scope Withdraw
Business Token Issued
Business Token Revoked
Business Tokens Revoked
RISC
  • 사용자 카카오계정의 이상징후와 관련된 보안 이벤트 타입
  • OpenID 재단의 RISC(Risk Incident Sharing and Coordination) 규격 사용
  • 사용자 계정의 비정상적인 활동이나 계정 탈취 시도 시 웹훅 전송

중요: 동의항목 설정 및 사용자 동의 필요
Account Credential Change Required
Account Disabled
Account Enabled
Account Purged
Credential Compromise
Identifier Changed
Identifier Recycled
Sessions Revoked
CAEP
  • 사용자 카카오계정에 발급된 자격증명(Token) 및 액세스 권한과 관련된 보안 이벤트 타입
  • OpenID 재단의 CAEP(Continuous Access Evaluation Protocol) 규격 사용
  • 인증 보안 수준이나 비밀번호 변경 시 웹훅 발송

중요: 동의항목 설정 및 사용자 동의 필요
Assurance Level Change
Credential Change
KAKAO
  • 사용자 카카오계정의 상태 정보 변경 시 발생하는 이벤트 타입
  • 카카오에서 정의하여 제공하는 규격
  • 이메일, 생일 등 프로필 정보 변경 시 웹훅 발송
User Profile Changed

CAEP, RISC 카테고리의 변경 이벤트는 민감 정보를 포함합니다. 따라서 [카카오계정 상태 변경 내역] 동의항목 설정 및 사용자 동의가 필요합니다.

필요 시 아래 절차를 수행합니다.

  1. 데브톡으로 [카카오계정 상태 변경 내역] 동의항목의 동의 단계 설정 권한 요청
    • 해당 권한은 적합성 검토 후 제공하므로, 요청 시 구체적인 사용 시나리오 포함 필요
  2. 권한 부여 후, 앱 관리 페이지의 [카카오 로그인] > [동의항목]에서 [카카오계정 상태 변경 내역]을 [필수 동의] 또는 [선택 동의] 동의 단계로 설정 (참고: 설정하기)
사용자가 동의한 경우만 제공

CAEP, RISC 카테고리 이벤트 정보는 사용자가 [카카오계정 상태 변경 내역]에 동의한 경우에만 제공합니다. 해당 정보를 반드시 수신해야 하는 서비스는 [카카오계정 상태 변경 내역] 동의항목을 [필수 동의] 동의 단계로 설정해야 합니다.

이름타입설명
subjectSubject이벤트 대상 사용자
reasonString토큰 만료 주체
  • issuer: 발급자
  • user: 사용자
  • 이벤트 발생 시점: 사용자가 앱과 연결
  • 권장 조치 사항: [로그인 시 앱 자동 연결]을 [사용 안 함]으로 설정한 앱인 경우, 회원 가입 완료 처리 외 서비스에서 필요한 조치 수행
  • 스키마: https://schemas.openid.net/secevent/oauth/event-type/user-linked
이름타입설명
subjectSubject이벤트 대상 사용자
  • 이벤트 발생 시점: 사용자가 앱과 연결 해제
  • 권장 조치 사항: 사용자 회원 정보의 카카오 로그인 연동을 해제하거나, 카카오 로그인으로만 이용 가능한 경우에는 회원 탈퇴 처리(참고: 연결 해제 웹훅)
  • 스키마: https://schemas.openid.net/secevent/oauth/event-type/user-unlinked
이름타입설명
subjectSubject이벤트 대상 사용자
reasonString사용자가 앱과 연결을 끊은 경로, 아래 중 하나
  • ACCOUNT_DELETE: 카카오계정 탈퇴
  • FORCED_ACCOUNT_DELETE: 장기 휴면 또는 고객센터에서 카카오계정 강제 탈퇴
  • INCOMPLETE_SIGN_UP: 가입 미완료자 탈퇴
  • UNLINK_FROM_ADMIN: 카카오 관리자로 인한 탈퇴 처리
  • UNLINK_FROM_APPS: 카카오계정 페이지에서 서비스 연결 해제
  • REVOKE_ACCOUNT_SERVICE_TERMS: 통합서비스 약관 동의 철회
  • UNLINK_FROM_SERVICE: 서비스 탈퇴
  • 이벤트 발생 시점: 사용자가 카카오 로그인을 통해 동의항목에 동의
  • 스키마: https://schemas.openid.net/secevent/oauth/event-type/user-scope-consent
이름타입설명
subjectSubject이벤트 대상 사용자
scopeString사용자가 동의한 동의항목
각 동의항목의 ID를 공백으로 이어 붙인 하나의 문자열
(예: account_email birthday age_range)
  • 이벤트 발생 시점: 사용자가 동의한 동의항목에 대해 동의 철회
  • 스키마: https://schemas.openid.net/secevent/oauth/event-type/user-scope-withdraw
이름타입설명
subjectSubject이벤트 대상 사용자
scopeString사용자가 동의 철회한 동의항목
각 동의항목의 ID를 공백으로 이어 붙인 하나의 문자열
(예: account_email birthday age_range)

아래 표와 페이로드 예시 참조.

이름타입설명
subjectBizTokenSubject발급 대상 비즈니스 토큰 정보
token_subjectTokenOwnerSubject토큰 소유 사용자 정보
token_idString비즈니스 토큰 ID
token_classString토큰 종류, business로 고정
필드타입설명
subject_typeStringoauth_token으로 고정
token_typeStringbusiness_access_token으로 고정
token_identifier_algString토큰 해시 방식, hash_sha256으로 고정
tokenString암호화된 토큰 값, base64url(sha256(토큰 값)) 형식의 해시 값
필드타입설명
subject_typeStringiss-sub으로 고정
issStringhttps://kauth.kakao.com/로 고정
subString사용자의 비즈니스 인증 회원번호

아래는 비즈니스 토큰 관련 이벤트의 SET 페이로드 예시입니다.

{
"events": {
"https://schemas.openid.net/secevent/oauth/event-type/token-issued": {
"subject": {
"subject_type": "oauth_token",
"token_type": "access_token",
"token_identifier_alg": "hash_sha256",
"token": "base64url(sha256(${TOKEN_VALUE}))"
},
"token_subject": {
"subject_type": "iss-sub",
"iss": "https://kauth.kakao.com/",
"sub": "${TOKEN_USER_ID}"
},
"token_id": "${TOKEN_ID}",
"token_class": "business"
}
}
}

아래 표와 페이로드 예시 참조.

이름타입설명
subjectBizTokenSubject철회 대상 비즈니스 토큰 정보
token_subjectTokenOwnerSubject토큰 소유 사용자 정보
token_idString비즈니스 토큰 ID
token_classString토큰 종류, business로 고정

아래 표와 페이로드 예시 참조.

이름타입설명
subjectTokenOwnerSubject토큰이 철회된 사용자 정보
token_classString토큰 종류, business로 고정

RISC 카테고리 이벤트는 동의항목 설정 및 사용자 동의가 필요합니다.

이름타입설명
subjectSubject이벤트 대상 사용자
  • 이벤트 발생 시점: 계정 비활성화
    카카오계정 보호 조치, 잠금 처리, 이용 제재 시
  • 필수 조치 사항: 계정이 비활성화된 이유가 hijacking인 경우 현재 열려 있는 세션을 종료하여 사용자 계정 보호, 계정이 비활성화된 이유가 bulk-account인 경우 서비스에서 사용자의 활동을 분석하고 필요한 후속 조치 결정
  • 스키마: https://schemas.openid.net/secevent/risc/event-type/account-disabled
이름타입설명
subjectSubject이벤트 대상 사용자
reasonString카카오계정 비활성화 원인
이름타입설명
subjectSubject이벤트 대상 사용자
이름타입설명
subjectSubject이벤트 대상 사용자
  • 이벤트 발생 시점: 계정 자격증명 손상
    카카오계정 자격증명이 탈취 의심되는 경우(예: 계정 탈취가 의심되는 새로운 환경에서 로그인 성공)
  • 권장 조치 사항: 서비스에서 의심스러운 활동이 있는지 확인하여 필요한 후속 조치 결정
  • 스키마: https://schemas.openid.net/secevent/risc/event-type/credential-compromise
이름타입설명
subjectSubject이벤트 대상 사용자
이름타입설명
subjectIdentiferSubject변경 전 식별자
new_valueString변경된 전화번호 또는 이메일
이름타입설명
subject_typeStringphone 또는 email
phone_numberString전화번호가 변경되었거나 사용 불가 처리된 경우, 기존 전화번호
account_emailString이메일가 변경되었거나 사용 불가 처리된 경우, 기존 이메일
  • 이벤트 발생 시점: 기존 계정 식별자 사용 불가, 카카오계정의 이메일 또는 전화번호가 다른 사용자에게 사용돼 이메일 인증 만료(Expired), 유예(Suspended) 상태가 된 경우
  • 권장 조치 사항: 사용자 계정의 이메일 및 전화번호를 더 이상 사용하지 않도록 처리하고, 서비스에서 직접 새로운 이메일 및 전화번호 수집
  • 스키마: https://schemas.openid.net/secevent/risc/event-type/identifier-recycled
이름타입설명
subjectIdentiferSubject사용 불가 처리된 기존 식별자
new_valueString사용 불가 처리된 전화번호 또는 이메일
이름타입설명
subjectSubject이벤트 대상 사용자

CAEP 카테고리 이벤트는 동의항목 설정 및 사용자 동의가 필요합니다.

  • 이벤트 발생 시점: 인증 보안 수준 변경
    2차 인증 설정 등 보안 수준 변경 시 발생
  • 권장 조치 사항: 현재 사용자가 서비스 이용에 필요한 인증 보안 수준을 충족하는지 확인 후, 필요에 따라 재인증 등 조치를 거쳐 서비스 제공
  • 스키마: https://schemas.openid.net/secevent/caep/event-type/assurance-level-change
이름타입설명
current_levelString카카오계정 인증 레벨
  • nist-aal1: 2차 인증 미설정 상태
  • nist-aal2: 2차 인증 설정 상태
previous_levelString변경 전 카카오계정 인증 레벨
  • nist-aal1: 2차 인증 미설정 상태
  • nist-aal2: 2차 인증 설정 상태
change_directionString카카오계정 인증 레벨 변경 사항
  • increase: 인증 레벨 상향
  • decrease: 인증 레벨 하향
이름타입설명
subjectSubject이벤트 대상 사용자
change_typeString계정 비밀번호 변경 유형
  • update: 비밀번호 변경 또는 카카오 인증서 재발급
  • 이벤트 발생 시점: 사용자의 카카오계정 정보 변경
    단, 사용자가 제공 동의한 정보 변경 시에만 알림
  • 권장 조치 사항: 사용자 정보 조회 API를 호출하여 변경된 정보로 업데이트
  • 스키마: https://schemas.kakao.com/platevent/kakao/event-type/user-profile-changed
이름타입설명
profileString사용자가 변경한 프로필 정보
각 동의항목의 ID를 공백으로 이어 붙인 하나의 문자열
변경된 값은 전달하지 않고, 변경이 발생한 사용자 정보 종류만 전달
(예: account_email birthday age_range)

서비스는 카카오계정의 변경 이벤트 정보가 담긴 보안 이벤트 토큰(Security Event Token, SET)을 POST 메서드로 전달받습니다.

아래는 웹훅 URL로 전달되는 요청 예시입니다. 웹훅 요청의 헤더(Header) Content-Typeapplication/secevent+jwt, 본문은 변경 이벤트 정보가 담긴 SET 값입니다. SET은 JWT(JSON Web Token) 형식의 토큰으로, 아래 세 가지 영역으로 구성돼 있습니다.

POST /kakao/events HTTP/1.1
Host: callback.example.com
Content-Type: application/secevent+jwt
Accept: application/json
eyJraWQiOiI2NjVhYmVlYzExOGRkZmMyZDNiZjNlMmFkYWU3OT...

SET은 세 영역의 값을 Base64 인코딩(Encoding) 한 후 온점(.)으로 이어 붙인 하나의 문자열로 생성됩니다. 따라서 온점을 기준으로 각 영역을 분리하고, Base64 디코딩(Decoding)하여 내용을 확인할 수 있습니다. 서비스는 SET 검증 후 페이로드 내용을 확인하여 필요한 사용자 계정 보호 조치를 수행할 수 있습니다. 아래는 디코딩된 SET 헤더와 페이로드 예제입니다.

{
"kid": "665abeec118ddfc2d3bf3e2adae799",
"typ": "secevent+jwt",
"alg": "RS256"
}
구분설명
헤더(Header)SET 규격 정보
페이로드(Payload)변경 이벤트 정보
서명(Signature)카카오 인증 서버(KAUTH)가 헤더kid에 해당하는 공개키로 서명한 값

아래는 헤더, 페이로드 영역에 포함되는 필드의 상세 정보입니다.

이름타입설명필수
algStringSET에 적용된 암호화 방식, RS256으로 고정O
typStringSET의 형식, secevent+jwt으로 고정O
kidStringSET 암호화 시 사용된 공개키 ID
메타데이터 조회의 SET 암호화 공개키 조회 URI(jwks_uri)에서 확인 가능
O
이름타입설명
audStringSET을 전달받는 앱의 대표 REST API 키
subStringSET에 해당하는 사용자 회원번호
issStringSET 발급 기관, https://kauth.kakao.com으로 고정
txmString웹훅 이벤트 요청을 식별하기 위한 고유 식별 값
toeInteger이벤트 발생 시각
유닉스 타임스탬프 형식(단위: 초)
iatIntegerSET 발급 시간
유닉스 타임스탬프 형식(단위: 초)
jtiStringSET 고유 식별 값
eventsEvent변경 이벤트 타입 및 상세 정보
이름타입설명
${SCHEMA}JSON변경 이벤트 타입별 상세 정보
키는 변경 이벤트 타입Schema
값은 변경 이벤트 타입마다 차이가 있으므로 이벤트 상세 정보 참고
이름타입설명
subject_typeString사용자 식별자 타입
  • iss-sub: 회원번호
  • phone: 전화번호
  • a ccount_email: 이메일
issStringSET 발급 기관
https://kauth.kakao.com로 고정

중요: Identifier Changed, Identifier Recycled 타입 변경 이벤트 정보에는 미포함
subStringSET에 해당하는 사용자 회원번호

중요: Identifier Changed, Identifier Recycled 타입 변경 이벤트 정보에는 미포함

서비스는 변경 이벤트 정보에 따른 사용자 계정 보호 조치를 수행하기 전 반드시 SET 내용을 확인하고 검증해야 합니다. 아래 순서로 SET 내용을 확인하고 검증할 수 있습니다.

  1. 온점(.)을 기준으로 헤더, 페이로드, 서명을 분리
  2. 페이로드를 Base64 방식으로 디코딩
  3. 페이로드의 iss 값이 https://kauth.kakao.com와 일치하는지 확인
  4. 페이로드의 aud 값이 서비스 앱의 REST API 키와 일치하는지 확인
  5. 서명 검증

서명 검증은 아래 순서로 수행합니다.

  1. 헤더를 Base64 방식으로 디코딩
  2. OIDC: 공개키 목록 조회로 카카오 인증 서버가 서명 시 사용하는 공개키 목록 조회
  3. 공개키 목록에서 헤더의 kid에 해당하는 공개키 값 확인
    • 공개키는 일정 기간 캐싱(Caching)하여 사용할 것을 권장하며, 지나치게 빈번한 요청 시 요청이 차단될 수 있으므로 유의
  4. JWT 서명 검증을 지원하는 라이브러리를 사용해 공개키로 서명 검증
    • 참고: OpenID Foundation, jwt.io
    • 라이브러리를 사용하지 않고 직접 서명 검증 구현 시, RFC7515 규격에 따라 서명 검증 가능

SET 수신 서버가 웹훅 수신 후 SET 검증에 성공한 경우, 본문 없이 HTTP 상태 코드 202 Accepted로 3초 내에 응답해야 합니다. 아래 예제를 참고합니다.

HTTP/1.1 202 Accepted

SET 수신 서버가 웹훅 수신 후 SET 검증에 실패한 경우, 아래 형식으로 3초 내에 응답해야 합니다.

  • HTTP 상태 코드: 400 Bad Request
  • 헤더의 Content-Type: application/json
  • 본문: JSON 형식으로 RFC8935 규격에 따라 에러 코드(err)와 이유(description) 포함

아래 예제를 함께 참고합니다.

// HTTP/1.1 400 Bad Request
// Content-Type: application/json
{
"err": "invalid_key",
"description": "Key ID 12345 has been revoked."
}
Error Code설명
invalid_request전달된 SET가 JWT 규격에 맞지 않을 경우
invalid_key전달된 SET을 카카오의 공개키로 복호화 실패 시
invalid_issuer전달된 SET의 issuer가 카카오가 아닐 경우
invalid_audience전달된 SET의 aud 값이 서비스 앱ID와 일치하지 않을 경우
메서드URL인증 방식
GEThttps://kauth.kakao.com/.well-known/ssf-configuration-

계정 상태 변경 웹훅 시스템의 규격을 확인합니다.

이름타입설명필수
issuerStringSET 발급자
https://kauth.kakao.com으로 고정
O
jwks_uriStringSET 암호화 공개키 조회 URI
공개키는 SET 검증 시 필요
O
delivery_methods_supportedString지원하는 SSE 이벤트 전송 방식
push만 지원
O
stateString요청 시 전달한 state 값과 동일한 값X
curl -X GET https://kauth.kakao.com/.well-known/ssf-configuration
// HTTP/1.1 200
{
"issuer": "https://kauth.kakao.com",
"jwks_uri": "https://kauth.kakao.com/.well-known/jwks.json",
"delivery_methods_supported": "http://schemas.openid.net/secevent/risc/delivery-method/push"
}

계정 상태 변경 웹훅을 테스트할 수 있습니다. [도구] > [웹훅 테스트]에서 테스트 기능을 확인할 수 있습니다. 자세한 내용은 계정 상태 변경 웹훅 테스트를 참고합니다.

도움이 되었나요?