Django | 클래스 101 클론 - 카카오톡 소셜 로그인

김민철·2021년 2월 11일
1

팀프로젝트

목록 보기
5/8

이번 프로젝트 회원가입/로그인 부분에는 카카오톡 로그인을 추가했습니다. 소셜 로그인은 그림과 같은 과정으로 진행됩니다.

1. 흐름

1,2,3,4 - 클라이언트에서 카카오 소셜로그인을 이용하면, 카카오톡 서버에서 클라이언트로 토큰을 줍니다.

5 - 클라이언트는 카카오톡 토큰을 서버에 전달합니다.

6 - 백엔드는 카카오 토큰을 카카오한테 다시 보내며, 이 토큰에 들어있는 정보를 요청합니다.

7 - 요청을 받은 카카오는, 유저가 동의한 정보들을 줍니다.

8 - 백엔드는 카카오로 받은 데이터를 DB로 넘겨줍니다. 이 과정에서 DB에 유저 정보가 없으면 DB에 정보를 넣어주고, 유저 정보가 있으면 로그인을 시켜줍니다.

1,2,3,4,5 번은 클라이언트와 카카오톡 사이에서 진행됩니다. 백엔드는 6, 7, 8 번 과정에만 관여하게 됩니다. 백엔드가 처리할 부분에 대한 코드입니다.

2. 로직 설명

6번 과정. 클라이언트에서 받은 요청에서 카카오톡 토큰을 찾습니다.

access_token = request.headers['Authorization']

카카오톡에서 받은 토큰을 다시 카카오톡으로 보냅니다.

kakao_header = {'Authorization': f'Bearer {access_token}'}
url = 'https://kapi.kakao.com/v2/user/me'
response = requests.get(url, headers=kakao_header)

7번 과정. 카카오톡에서 데이터를 넘겨줍니다.

data = response.json()

8번 과정. 유효하지 않는 토큰에 대해 예외처리를 해주고, 받아온 유저 정보를 바탕으로 로그인 또는 회원가입을 진행합니다.

if not data.get('id'):
    return JsonResponse({'message': 'INVALID_TOKEN'}, status=401)

email = data['kakao_account']['email']
name  = data['kakao_account']['profile']['nickname']

user, created = User.objects.get_or_create(email=email, name=name)

카카오톡 로그인 과정이 끝나면, 지정해준 jwt 토큰을 주고 로그인을 끝내게 됩니다.

access_token = jwt.encode({'id': user.id}, SECRET, algorithm=ALGORITHM)

.

3. 마무리

백엔드 입장에서 다시 정리하면,
클라이언트에서 카카오 토큰을 받고 그 토큰을 가지고 카카오로 정보를 달라고 요청합니다.
그러면 유저정보가 카카오에서 백엔드로 들어옵니다. 이 정보를 바탕으로 로그인과정을 마무리해줍니다.

참고
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#request-token

0개의 댓글