* 포스팅 된 내용은 카카오 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 |
* 위 작업을 정상적으로 완료한 경우, 사용자 정보를 통하여 서비스에서 활용할 수 있다.