* 포스팅 된 내용은 카카오 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

 

 

 * 위 작업을 정상적으로 완료한 경우, 사용자 정보를 통하여 서비스에서 활용할 수 있다.

 

+ Recent posts