[Django] Kakao 소셜로그인 API

2021. 10. 3. 23:41코딩일지/Django

소셜 로그인? 일반 로그인?

지금까지 프로젝트를 하면서 회원가입과 로그인 로직을 구현하고 통신을 했던 것은 

프로젝트 자체 서버의 DB에 회원가입 데이터를 저장해서 로그인할때 불러오는 로직을 구현했지만,

소셜 로그인은 Kakao에 요청을 보내서 데이터를 받아와서 불러와준다고 생각하면 이해하기 쉽다.

오늘은 소셜로그인에 대해서 알아보도록 하겠습니다.

 

※ 카카오 공식문서 (Kakao Developers)

https://developers.kakao.com/

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

  • 내가 제일 간과했던것이 카카오 공식문서를 세세히 읽어보지 않고 무작정 코드를 쳐보려고 한 것이 문제였다.
  • 모든 것은 카카오 공식문서에서 알려준다 할 정도록 설명이 잘 되어있다.
  • 아래는 우리가 이해해야하는 카카오에 대한 요청과 응답에 대한 자료이다.

  • 공식문서를 천천히 살펴보면 OAuth 2.0 개념이 나온다.

 

★ OAuth 2.0 이 무엇일까? OAuth 2.0

공개 API(Open API)로 제공되는 표준 인증 방법이다.

3단계로 이어지는 이러한 표준 인증 방법은 [인증코드 - 토큰 - 토큰으로 API를 호출] 흐름을 가지는 표준 인증방법이라고 생각하면 된다. 

 

깔끔하게 정리하자면,

1. 인가코드를 카카오 인증서버에서 받기
2. 받은 인가코드를 이용해 카카오 인증서버에서 access token과 refresh token 받기
3. access token과 refresh token로 카카오 서버의 Databases에 저장되어있는 회원정보 받아오기  
  • 혼자서 코드를 짜볼때 인가 코드를 받아오는 것을 프런트와 상의해야 한다.
  • 백엔드 혼자서도 인가 코드를 받고 토큰을 발행하는 것 까지 가능했지만, 이번 2차 프로젝트를 진행하면서 프런트에서 인가코드를 받아와줘서 코드가 더 간략해졌다.
  • 프론트에서 access token을 발행해주면, 그에 필요한 KakaoAPI에 접속하여 정보를 받아왔다.

 

※ 카카오 로그인 요청하는 법 & 요청 결과 확인

  • 이제 프런트엔드에서 받아온 Access token을 가지고 카카오 자원 서버에 요청해보자. 
  • Kakao Developers에 들어가서 REST API를 눌러보면 REST API 테스트 도구가 있다.
  • 테스트 도구를 눌러보자.

 

  • 여기서 중요한 것이 우리는 사용자 정보가 필요로 하기 때문에 왼쪽에 사용자 정보 가져오기를 클릭해야 한다!

 

  • 또한, 우리가 진행하는 프로젝트에 필요로 한 정보만을 가지고 토큰을 발급해야 하기에 모델링에 필요한 정보들만 담아서 토큰을 발행한다.

 

  • 토큰을 발급하고 전송을 누르면 우리가 필요로 하는 카카오 정보를 json 형태로 주게 된다.
  • 본 프로젝트에서는 닉네임과 프로필 이미지가 필요했기에 두 개의 정보를 받아왔다.
  • 또한 요청 코드 예시를 보면 GET메서드로 요청을 해준다.
  • 사용자 정보에 대한 API는 "https://kapi.kakao.com/v2/user/me"로 보내야 하고, (Authorization)인가 토큰은 Bearer type으로 (access_token)을 담아서 요청해야 한다라고 아주 친절히? 설명해주고 있다.

 

★ 위의 tnb처럼 자신의 애플리케이션을 가지고 원하는 정보를 가져오고싶다면, 내 어플리케이션을 들어가서 만들어주고 카카오 로그인 동의 항목을 바꿔주면 된다.

 

내 어플리케이션 창
카카오 로그인 동의항목 확인

 

※ 코드로 적용해보기

  • post method로 access_token이라는 변수를 지정해 헤더로 받아서 "Authorization"으로 인가 토큰으로 받아줍니다.
  • 이어서 requests를 사용해 get으로 위에서 알려준 사용자 정보를 받아 올 수 있는 api와 bearer타입으로 인가 토큰을 받아 검증을 하고 그에 대한 응답을 json으로 변환해 변수에 저장해줍니다.
  • code == -401에 대한 에러는 유닛 테스트 게시글에서 설명해드리겠습니다.
  • 받아온 json() 파일들을 필요한 객체로 불러와서 변수에 저장

 

  • 본 프로젝트는 향후 확장성을 고려해 플랫폼을 나누어서 모델링하였습니다.(id=1에 kakao라는 플랫폼을 저장해둠)
  • get_or_create를 사용해서 받아온 정보를 필요한 정보로 바꾸어 회원가입이 필요로 되지 않게 Database에 바로 저장
  • social_id의 kakao_id는 카카오 유저가 가진 고유의 아이디이기에 바뀔 수가 없다.

 

※ Postman을 사용해 로그인 및 회원가입에 대한 통신 확인

  • urls.py를 만들어서 저는 sign-in/kakao라는 엔드포인트를 주었습니다.
  • header에  키값에는 Authorization, 벨류 값에는 인가 토큰을 넣어주면 성공메시지와 함께 토큰 발행이 완료됩니다.
  • 저는 데이터 베이스를 비워 놨기 때문에 새로 DB에 정보가 생성되면서 저장되었습니다.
  • 여기에서 받은 access_token은 프로젝트의 기능을 사용하기 위한 일반 로그인 때 발급받은 토큰과 같은 역할이라고 보시면 됩니다.

텍스트 부분은 보안상 가렸습니다 ㅎㅎ..
성공적으로 DB에 저장된 내정보

부족한 설명에도 읽어주셔서 감사합니다.

소셜 로그인에 대해서 이해를 잘 못해서 멘털이 많이 무너졌지만 하나하나 천천히 읽어보니 해답이 하나씩 나왔습니다.

너무 조급해하지 않고 작은 것을 캐치하는 공부 방법을 배워서 뿌듯합니다 ㅎㅅㅎ

소셜 로그인에 대해서 궁금한 점이나 제가 도울 수 있는 부분이 있다면 언제나 도와드리겠습니다.

다음 게시물에선 필수이면서 무C무C한 유닛 테스트에 대해서 알아보겠습니다.

감사합니다.