* 포스팅 된 내용은 카카오 OAuth를 사용하여 프로필의 정보를 가져와 서비스 로그인 활용하는 내용을 작성

카카오 로그인 개요
- REST API를 사용한 카카오 로그인은 HTTP 요청이 가능한 모든 환경에서 쓸 수 있다.
- REST API를 사용한 카카오 로그인은 카카오 계정 정보를 입력하는 웹뷰(Web View)를 사용
- 사용자가 로그인을 요청하면 클라이언트(Client)에 카카오 계정 입력 페이지가 나타난다.
- REST API로 구현하는 카카오 로그인은 인증코드 받기, 사용자 토큰 받기의 두 단계를 거친다.
- 먼저 인증 코드를 받고 그 인증 코드로 사용자 토큰을 요청하는 방식
인증 코드 받기
- 카카오 로그인을 시작하는 단계
- 로그인 동의 화면을 호출하고, 인증 코드 발급을 요청하는 API
- 서비스에서 인증 코드 받기 요청을 하면, 카카오는 인증 코드 발급에 앞서 사용자에게 동의 화면을 보여줌
- 사용자가 로그인 동의 항목들을 선택하고 '동의하고 시작하기'를 누르면, 카카오는 해당 사용자에 대한 인증 코드를 발급해 서비스에 전달
- 인증 코드 받기 요청 시, 해당 기기에서 카카오계정으로 6시간 이내에 로그인한 적이 있다면 바로 로그인 화면이 나타나거나 로그인된다.
- 그렇지 않다면, 로그인 창으로 리다이렉트된다.
- 로그인 화면에서 사용자가 동의 버튼을 클릭하면 인증 코드가 담긴 쿼리 스트링(QueryString)을 요청 시 전달된 redirect_uri로 전송한다.
- 이때, 응답 상태 유형은 HTTP 302 Redirect로, Location에 인증 코드 또는 에러 유형을 포함
- 사용자가 취소 버튼을 클릭하면 에러 쿼리 스트링이 request_uri로 전송된다.
1. 인증 코드 요청
URL
Name | |
HOST | kauth.kakao.com |
URI | /oauth/authorize |
Parameter
Name | Description | Required |
client_id | - 앱 생성 시 발급 받은 REST API 키 | O |
redirect_uri | - 코드를 리다이렉트 해줄 URI | O |
response_type | - code 문자열 값으로 고정 | O |
state | - 로그인 이전 상태를 유지하기 위해 저장하는 값 - 결과가 리다이렉트될 때 입력한 state 값이 그대로 전달됨 - Cross-site Request Forgery 공격을 보호하기 위해 활용 가능 |
X |
Response
Name | Description |
code | 사용자 토큰 받기 요청에 필요한 인증 코드 |
Sample
Name | URL |
redirect_uri | http://localhost:8000/users/login/kakao/redirect |
request_url | https://kauth.kakao.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code |
* 위 작업 시 인증 코드를 활용하여 access_token값을 요청할 수 있는 상태가 된다.
2. 사용자 토큰 받기
- 인증 코드를 받은 뒤, 인증 코드로 사용자 토큰을 발급 받는 API
- 사용자 토큰 발급까지 완료되어야 로그인 절차가 끝난다.
- 필수 파라미터 값들을 담아 POST로 요청
- 요청 성공 시, 응답은 JSON 객체로 Redirect URI에 전달되며 두 가지 종류의 토큰과 타입, 초 단위로 된 만료 시간을 포함
- 사용자가 로그인에 성공하면 발급되는 액세스 토큰(Access Token)과 리프레시 토큰(Refresh Token)은 각각 역할과 유효기간이 다르다.
- 실제 사용자 인증을 맡는 액세스 토큰은 비교적 짧은 만료 시간을 가진다.
- 하지만 유효한 리프레시 토큰이 있다면, 사용자가 다시 로그인했을 때 리프레시 토큰으로 액세스 토큰을 다시 발급 받을 수 있다.
URL
Name | |
HOST | kauth.kakao.com |
POST URI | /oauth/token |
Content-type | application/x-www-form-urlencoded;charset=utf-8 |
Parameter
Name | Description | Required |
grant_type | - authorization_code로 고정 | O |
client_id | - 앱 생성 시 발급 받은 REST API 키 | O |
redirect_uri | - 코드가 리다이렉트 된 URI | O |
code | - 코드 받기 요청으로 얻은 인증 코드 | O |
client_secret | - 토큰 발급 시, 보안을 강화하기 위해 추가 확인하는 코드 | X |
Response
Name | Description |
access_token | - 사용자 액세스 토큰 값 |
token_type | - 토큰 타입(OAuth 2.0 bearer Authentication) |
refresh_token | - 사용자 리프레시 토큰 값 |
expires_in | - 토큰 만료 시간(초) |
scope | - 인증된 사용자의 정보 조회 권한 범위 |
Sample
Name | URL |
code | 인증 코드 요청을 통해 받은 code값 |
redirect_uri | http://localhost:8000/users/login/kakao/redirect |
request_url | https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id={client_id}&redirect_uri={redirect_uri}&code={code} |
* access_token을 이용하여 kakao 사용자 관리 API를 호출할 수 있는 상태
3. 사용자 정보 요청
- 현재 로그인한 사용자의 정보를 불러온다.
- 사용자 정보 요청 REST API는 사용자 액세스 토큰을 사용하는 방법, 앱 어드민 키를 사용하는 방법 두 가지로 제공된다.
- 어드민 키는 앱의 마스터 키와 같아 보안에 유의해야 하므로 서버에서 호출할 때만 사용한다.
- 사용자 액세스 토큰 또는 어드민 키와 사용자 ID를 헤더(header)에 담아 GET/POST로 요청한다.
- 어드민 키로 요청할 때는 어떤 사용자의 정보가 필요한 지 명시하기 위해 대상 사용자의 ID를 전달한다.
- 추가 파라미터를 사용하면 특정 정보만 지정해서 받아오거나 URL 응답 값을 https로 받을지 지정할 수 있다.
- 사용자 정보에는 앱 설정에 등록해 사용하는 추가 사용자 정보 기능이 제공된다.
- 예로 서비스에서 따로 설정한 사용자 닉네임 등을 카카오 계정 정보에도 저장해 둘 수 있다.
- 사용자 정보 요청 성공 시, 응답 바디(Body)는 JSON 객체로 사용자 정보들을 포함한다.
* 현재 페이지에서는 Access Token을 사용하는 내용만을 서술, Admin Key를 사용하는 방식은 카카오 공홈 참고
URL
Name | |
HOST | kauth.kakao.com |
POST URI | /v2/user/me |
Authorization | Bearer {access_token} |
Content-type | application/x-www-form-urlencoded;charset=utf-8 |
Header
Name | Description | Required |
Authorization | 헤더 포맷 Authorization: Bearer ${access_token} |
O |
Additional Parameter
Name | Type | Description |
secure_resource | Boolean | 이미지 URL 값 HTTPS 여부, true 설정 시 HTTPS 사용, 기본 값 false |
property_keys | JSON Array | Property 키 목록, JSON Array를 ["properties.nickname"]과 같은 형식으로 사용 |
Property keys
Name | Description |
properties.nickname | - 서비스에서 쓰이는 사용자 닉네임 - 기본 값은 앱연결시의 카카오계정 닉네임 |
properties.profile_image | - 서비스에서 쓰이는 사용자 프로필 이미지 URL - 기본 값은 앱연결시의 카카오계정 프로필 이미지 URL(640* 640) |
properties.thumbnail_image | - 서비스에서 쓰이는 사용자 썸네일 이미지 URL - 기본 값은 앱 연결 시의 카카오계정 썸네일 프로필 이미지 URL(110* 110) |
kakao_account.profile | - 카카오계정의 프로필 소유 여부 - 실시간 닉네임과 프로필 이미지 URL |
kakao_account.email | - 카카오계정의 이메일 소유 여부 - 이메일 값, 이메일 인증 여부, 이메일 유효 여부 |
kakao_account.age_range | - 카카오계정의 연령대 소유 여부, 연령대 값 |
kakao_account.birthday | - 카카오계정의 생일 소유 여부, 생일 값 |
kakao_account.gender | - 카카오계정의 성별 소유 여부, 성별 값 |
Response (사용자 정보 공통 가이드)
Name | Type | Description |
id | Long | - 사용자 ID |
kakao_account | KakaoAccount | - 카카오계정 정보 (위 링크 참고) |
properties | JSON | - 추가 정보 |
synched_at | Datetime | - 카카오싱크 간편가입을 통해 로그인한 시각, UTC |
connected_at | Datetime | - 서비스에 연결 완료된 시각, UTC |
Sample
Name | URL |
access_token | 사용자 토큰 받기 과정을 통해 받은 access_token |
headers | Authorization: Bearer {access_token} |
request_url | https://kapi.kakao.com/v2/user/me |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
'id': integer, | |
'connected_at': string, | |
'properties': { | |
'nickname': string, | |
'profile_image': string, | |
'thumbnail_image': string | |
}, | |
'kakao_account': { | |
'profile_needs_agreement': boolean, | |
'profile': { | |
'nickname': string, | |
'thumbnail_image_url': string, | |
'profile_image_url': string | |
}, | |
'has_email': boolean, | |
'email_needs_agreement': boolean, | |
'is_email_valid': boolean, | |
'is_email_verified': boolean, | |
'email': string | |
} | |
} |
* 위 작업을 정상적으로 완료한 경우, 사용자 정보를 통하여 서비스에서 활용할 수 있다.