구글링을 해본 결과 두개의 velog에서 많은 도움을 받았다
그래서 나는 카카오소셜로그인의 기능구현에 대해서 적는 것 보다는
내가 Kakao Developer에 적힌 내용을 이해하는 거에 더 큰 중점을 둘 예정이다
Kakao Developer 사이트
https://developers.kakao.com
![](https://velog.velcdn.com/images%2Fbeanlove97%2Fpost%2Ff7031f13-1785-4b27-908b-bc7522a4f9fa%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-16%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%209.58.56.png)
웹사이트에서 카카오톡을 이용한 서비스를 구현할 때 Kakao Developer에서 여러가지 기능을 지원받을 수 있는 걸 확인했다...!
- 카카오 로그인
- 카카오톡 소셜
- 메시지
- 지도/로컬
- 카카오싱크
- 카카오톡 채널
- 비전
그중에서도 당연히 카카오 로그인
에 대해서 알아보려고 한다
⚠️ 주의 : 나 혼자 이해하기도 벅찬 내용이라 블로그의 내용이 더러울 것같다
그리고 이 블로그의 내용은 사실상 kakao developer 내용을 그대로 가져와서 본인이 이해할 수 있도록 적은거라 도움이 안될 것같다...
그럼에도 이렇게 블로깅을 하는 이유는 내가 직접 적어보면서 천천히 음미하면서(?) 이해하기 위함이다!!
0. 카카오 로그인 서비스 이해
- 카카오계정과 애플리케이션을 연결하고
- 토큰을 발급받아 카카오 API를 사용할 수 있도록 하는 기능
토큰
-
액세스 토큰(Access Token)
- 사용자를 인증하고 카카오 API 호출 권한을 부여한다
- 사용자를 인증하고 카카오 API 호출 권한을 부여한다
-
리프레시 토큰(Refresh Token)
- 액세스 토큰을 갱신하는 데 쓰인다
- 사용자가 매번 카카오계정 정보를 입력하거나 카카오톡으로 로그인하지 않고도 액세스 토큰을 발급받을 수 있게 해준다
로그아웃
- 로그인을 통해 발급받은
토큰을 만료
시켜 해당 사용자를 로그아웃시킨다
- 사용자가 서비스에서
로그아웃 요청
했을 때나 서버에서
특정 사용자를 로그아웃하도록 요청
할 때
연결 끊기
- 연결과 대조되는 개념
- 카카오계정과 앱의 연결을 끊는 기능
- 앱에서 더 이상 해당 사용자 정보로 API를 호출할 수 없다
- 카카오 플랫폼에서도 해당 앱에 대한 해당 사용자의 데이터가 모두 지워진다
로그아웃 또는 연결 끊기 후에도 다시 앱에 로그인 및 연결할 수 있습니다.
하지만 사용자가 연결을 끊었던 앱에 같은 카카오계정으로 다시 로그인 및 연결하더라도 기존 이용 정보는 남아 있지 않으며 복구도 불가능하다
카카오 로그인 구현 방법
- Kakao SDK for Android
- iOS
- JavaScript
- REST API
OAuth 2.0
공개 API(Open API)로 제공되는 표준 인증 방법
![](https://developers.kakao.com/docs/latest/ko/assets/style/images/kakaologin/kakaologin_process.png)
- 사용자가 앱에서 카카오 로그인 버튼을 클릭합니다.
1. 카카오톡 로그인 진행과정
카카오계정의 사용자 자격정보로 인가 코드를 받아오고,
인가 코드로 액세스 토큰과 리프레시 토큰을 얻는 과정으로 구성된다
-
사용자가 [카카오톡으로 로그인]
을 선택
- 카카오톡 실행 또는 실행 중인 카카오톡으로 연결된다
- 카카오톡에 연결된 카카오계정의 자격정보(Credentials)를 통해 사용자를 인식한다
-
[다른 카카오계정으로 로그인]
을 선택
- 직접 계정 정보를 입력하는 화면이 출력된다
- 해당 계정의 자격정보로 인식한다
-
카카오톡이 설치되어 있지 않은 기기나 PC 웹 환경
- 직접 계정 정보를 입력하여 카카오계정으로 로그인하게끔 진행된다
-
자격정보가 올바르다면
- 카카오 로그인 동의 화면을 통해 사용자로부터 사용자 정보 및 기능 활용 동의를 받는다.
- 사용자가 필수 항목에 동의하고 로그인을 요청하면
- 인가 코드(Authorization Code)가 발급되고
- 앱 정보의 Redirect URI
카카오 로그인버튼 누르는 화면
에 전달된다
-
서비스 앱이나 서버 에러가 아닌 요청 정보 문제로 로그인에 실패한다면
- 카카오 서버는 실패 원인을 응답으로 전달한다
- 이 때는 응답 코드를 참고해 원인을 찾아 수정할 수 있습니다.
-
로그인을 통해 앱과 사용자가 연결되고 토큰도 발급받았다면
- 사용자 정보 가져오기를 통해 현재 로그인한 사용자의 정보를 확인하여 서비스에 활용할 수 있다
앱은 전달 받은 인가 코드를 기반으로 토큰을 요청하고 받는다
카카오 서버 호스트 분류
- 인증 서버(kauth.kakao.com) : 카카오 로그인
- API 서버 : 사용자 정보 가져오기 등 다른 기능
2. 카카오 로그인 한 뒤, 사용자 동의받기
- 사용자 동의
- 카카오 로그인 할 때 서비스는 카카오 API를 통해 → 사용자 정보 및 서비스 접근권한을 요청하면서 사용자가 직접 동의해야 한다
- 동의 철회
- 서비스에서도
동의 철회하기 API
를 사용해 처리할 수 있다
- 사용자가 동의 철회 시에도 동의 철회하기 API가 호출된다
- 사용자는 카카오계정 웹사이트의
[계정 이용]
이나 카카오톡의 [설정] > [개인/보안] > [연결된 서비스 관리] 메뉴
를 통해 선택 동의 항목에 대한 동의
를 철회할 수 있습니다.
사용자의 동의를 받아야 하는 이유
- 모든 사용자 정보와 서비스 접근권한은 사용자 동의가 있어야만 제공되고
- 카카오계정에 저장되어 있는 정보라도 사용자가 앱에 제공하는 데 동의하지 않았다면 사용자 정보 가져오기를 통해 받을 수 없다
서비스 이용에 필수적인 동의 항목
[내 애플리케이션] > [카카오 로그인] > [동의 항목]
에서 카카오 로그인 시 제 3자 정보제공 동의를 받을 항목들을 설정할 수 있다
- 사용자의 동의를 받는 시점
- 사용자가 처음으로 카카오 로그인 하는 시점에 제공 동의하도록 처리할 수 있으나
- 카카오 API를 사용해 특정 정보가 필요한 시점에 동의를 요청할 수도 있다
- 일부 동의 항목은 서비스에
회원 가입할 때에 필요하지 않지만, 일부 기능을 이용할 때 필요해질 수 있다
- 사용자 정보를 과도하게 수집하지 않도록 해당 기능을 이용하려는 시점에 추가로 제공 동의받도록 하는 것이 좋다
needs_agreement
- 사용자 정보 종류별로 포함되어 있는 key 를 말한다
- 각 서비스에서 사용하도록 설정한 동의 항목에 한해 제공되고
사용자 동의 필요 여부
를 의미한다
- 특정 사용자 정보에 대해, 서비스에서
카카오 로그인 또는 추가 항목 동의 받기
를 통해
- 사용자로부터 제3자 제공 동의를 받으면 해당 정보를 받을 수 있는지 알려준다
needs_agreement key 값
-
true
: 추가 제공이 가능한 사용자 정보
- 추가 항목 동의 받기로 사용자 동의를 거쳐 값을 제공 받을 수 있다
-
false
: 이미 제공되고 있는 사용자 정보
- "false"지만 사용자 정보의 값이 없다면 : 해당 사용자 정보는 자체 수집하거나 관련 기능을 제공하지 않아야 한다
- 사용자가 해당 정보를 제공하지 않은 경우
: 카카오계정에서 수집한 뒤, 제공 기능을 사용해 값을 제공 받을 수 있다
- 사용자가 카카오계정 정보 수집에 동의하지 않은 경우
: 값을 제공할 수 없으므로 → 해당 사용자 정보가 없는 경우를 서비스에 고려해야 한다
![](https://velog.velcdn.com/images%2Fbeanlove97%2Fpost%2F869e8cad-d2e6-4669-8db7-acb5cc2bf934%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-16%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2012.47.45.png)
3. 사용자 정보
- 카카오 로그인 후
사용자 정보 가져오기
를 비롯한 카카오 API를 통해
→ 사용자 정보를 제공받을 수 있다
- 사용자 정보를 제공 받으려면 해당 사용자가 카카오 로그인 시 동의 항목을 통해
→ 앱에 정보를 제공하는 데 동의해야 한다
사용자 정보 가져오기 API로 받는 사용자 정보
- 사용자 정보 가져오기 API를 통해 → 사용자의 정보를 제공한다
- 제공 받은 사용자 정보의 활용
- 카카오 로그인
- 카카오싱크 간편가입할 때의 서비스의 회원 정보로 활용
- 카카오에서 취급하지 않는 정보(여권번호 등)는 서비스에서 직접 수집해야 한다
자료형과 형식을 포함한 상세 정보는 REST API 응답을 참고한다
![](https://velog.velcdn.com/images%2Fbeanlove97%2Fpost%2F34d7a550-7c2f-46ea-bce8-e94aa07011d0%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-16%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2012.54.56.png)
카카오계정 정보
- 카카오계정 정보에 포함된 각 항목은 정보 제공을 위해 해당 사용자 동의가 필요한지 알려주는
needs_agreement 값
을 포함한다
- needs_agreement 값이 true : 사용자 동의를 거쳐 해당 사용자 정보의 값을 받을 수 있는 상태
- 프로필 (닉네임/사진)
- 이메일
- 연령
- 생일
- 출생 연도 : 비즈니스로 설정해야 가능
- 성별
- 전화번호 : 비즈니스로 설정해야 가능
- 연계정보 (CI) : 비즈니스로 설정해야 가능
연계정보 ?!
카카오계정의 암호화된 이용자 확인 값
기존 회원 데이터베이스에 동일한 회원이 있는지 대조
하는 등 최소한의 목적으로만 참고하도록 제공되는 정보
구성: 연계정보, 발급 시각, 사용자 동의 시 제공 가능 여부
카카오는 본인인증기관이 아니므로 카카오계정의 연계정보로 서비스에 필요한 본인 인증을 대신할 수 없는 점은 주의해야 한다
⚠️ 사용자 정보 가져오기를 통해 원하는 사용자 정보를 응답 값으로 받지 못했다면
1. 동의 항목에 해당 사용자 정보 동의 항목을 설정했는지 확인한다
- '필수 동의' 또는 '선택 동의'로 설정해야 사용자 정보를 받을 수 있다
- 반드시 필요한 정보는 수집 후 제공 옵션을 사용한다
2. {FIELD_NAME}_needs_agreement의 값
을 확인한다
- 만약email_needs_agreement 값이 "true"
이면
- 추가 항목 동의 받기를 통해 사용자에게 필요한 동의 항목의 동의를 받으먼 된다
다른 API로 받는 사용자 정보
- 배송지 정보 : 비즈니스로 설정해야 가능
- 카카오톡 프로필
- 카카오톡 친구목록
- 카카오톡 채널 추가 상태 및 내역 : 비즈니스로 설정해야 가능
- 카카오스토리 프로필
- 카카오스토리 생일
- 카카오스토리 프로필 URL
4. 로그아웃
- 사용자가 카카오 로그인을 통해 발급받은 토큰을 만료시켜
- 로그아웃을 요청한 서비스에서 해당 사용자 정보로 카카오 API를 호출할 수 없게 한다
카카오톡 로그아웃 기능은 카카오 API 이용에만 영향을 미치므로 서비스 회원 로그아웃은 자체 구현해야 한다
카카오톡 로그아웃 진행과정
-
사용자가 같은 카카오계정으로 여러 기기에 로그인한 상태라면
- 로그아웃을 요청한 기기에서만 로그아웃된다
- 동일한 카카오계정으로 로그인되어 있는 다른 기기에서는 로그아웃 처리되지 않는다
-
사용자가 같은 카카오계정으로 한 웹 브라우저에서 여러 서비스에 로그인한 상태라면
- 로그아웃을 요청한 서비스에서만 로그아웃된다
- 같은 웹 브라우저에 동일한 카카오계정으로 로그인되어 있는 다른 서비스에서는 로그아웃 처리되지 않는다
동시 로그아웃 처리
- 서비스 로그아웃 버튼을 통해 서비스와 카카오계정을
동시에 로그아웃 처리
하고 싶다면 → 카카오계정과 함께 로그아웃하도록 하면 된다
- 사용자가 로그아웃 버튼을 눌러 로그아웃을 요청했을 때
- 사용자를 연결 페이지로 이동시켜 서비스만 로그아웃할 것인지,
- 카카오계정도 함께 로그아웃할 것인지 선택할 수 있다
기본적인 로그아웃 기능은 토큰 만료 방식으로 동작하지만, 이 기능을 사용하면
- 요청한 서비스의 세션과 카카오 로그인의 세션을 만료하여
- 서비스와 카카오 계정에서 로그아웃 처리된다
카카오계정과 함께 로그아웃 기능 구현순서
- 사용자가 로그아웃을 요청하고
- 리다이렉트될 Logout Redirect URI을 등록
- 서비스 서버에서 서비스 세션을 만료시킨다
카카오계정과 함께 로그아웃 기능 동작순서
- 사용자가 로그아웃 버튼을 눌러 연결 페이지로 진입
- 사용자가 '서비스만 로그아웃', '카카오계정과 함께 로그아웃' 중 원하는 로그아웃 처리를 선택한다
- 서비스만 로그아웃을 선택 : 즉시 앱 정보에 등록된 Logout Redirect URI로 리다이렉트된다
- 카카오계정과 함께 로그아웃을 선택 : 카카오계정 로그인 상태에 따라 다르게 동작한다
- 카카오계정 세션이 있으면 만료시키고 앱정보에 등록된 Logout Redirect URI로 리다이렉트된다
리다이렉트된다말은 가볍게 해당하는 URL 페이지로 이동한다고 생각하면 될 것 같다
나중에 더 공부하기..!
카카오계정과 함께 로그아웃 기능은 REST API로 구현할 수 있다고 한다
5. 연결 & 연결 끊기
연결
- 카카오계정의 서비스 이용 상태
- 사용자가 서비스에 처음 로그인할 때 연결이 발생한다
- 서비스는 토큰 기반의 API를, 사용자는 해당 서비스에서 카카오 API를 각각 이용할 수 있게 된다
- 서비스와 사용자가 서로 연결되어 있지 않다면 카카오 API 관련 기능을 이용할 수 없다
연결 끊기
- 카카오 로그인 시 카카오 플랫폼에서 처리하기 때문에 → 서비스에서 별도 API를 호출해 연결 요청할 필요가 없지만, 연결을 끊는 것은 서비스에서도 가능하다
- 연결 끊기 API를 사용해 서비스와 사용자의 연결 상태를 해제할 수 있다
- 사용자는
서비스를 이용하고자
카카오계정 정보를 제공한 것이기 때문에
카카오 플랫폼 정책에 따라 사용자가 탈퇴하면 서비스에서 연결 끊기 처리
를 해야 한다
- 연결 끊기 : 사용자가 서비스에서 탈퇴하지 않아도 필요에 따라 호출할 수 있고 사용자가 직접 연결 끊기 요청을 할 수도 있다
- 사용자가 직접 연결 끊기 요청한다면 → 카카오에서 서비스 서버에 알림을 보내 연결 끊기 및 사용자 정보 처리를 요청한다
연결 끊기는 카카오계정과 앱의 관계만 끊을 뿐,
서비스 서버에 저장된 회원 정보까지 지우지 않기 때문에
지우기를 원한다면 회원 탈퇴처리를 해야 한다
서비스 회원 가입 및 탈퇴
- 각 서비스 회원 정보에 카카오계정 사용자 정보를 회원으로 저장하는 것
- 연결과는 별개의 처리
- 카카오계정으로 로그인한 사용자 정보를 서비스 서버에 회원 가입 처리하지 않으면 → 정상적인 가입 처리가 완료되지 않는다
- 서비스 회원 탈퇴 또한 서비스가 자체적으로 구현해야 한다
6. 추가 항목 동의 받기
- 사용자가 첫 카카오 로그인 시 동의 화면에서 동의하지 않았지만,
- 서비스 이용 중 추가로 동의해야 하는 항목을 동의 요청하는 기능
- 추가 항목 동의 받기 API를 통해 사용자가 특정 기능을 이용하려고 할 때 필요한 사용자 정보나 서비스 접근권한에 동의하도록 할 수 있다
- 사용자가 카카오에도 제공을 거부한 정보(needs_agreement = false)는 카카오도 수집할 수 없다
: 서비스에서 추가 항목 동의 받기 기능을 사용해도 카카오로부터 제공 받을 수 없으므로, 자체적으로 사용자로부터 수집해야 한다
- 서비스 약관은 이 기능로도 추가 동의받을 수 없다
: 운영 중 추가되는 약관은 자체 페이지를 통해 사용자로부터 동의받아야 한다