2차 프로젝트에는 회원가입과 로그인을 소셜로그인으로 통합하여 코드를 작성하기로 하였다. 그 중 카카오를 이용한 소셜로그인에 대해 정리해보고자 한다.
본래 웹사이트를 이용하기 위해 회원가입을 하려면 사이트가 요구하는 정보를 일일히 작성해야 헀고, 사이트는 이 정보를 데이터베이스에 넣어야 했다. 하지만 여러 사이트가 필요로 하는 정보라는 것이 크게 다른 경우가 많지 않고, 다르다 하더라도 일부분만 다른 경우가 많다. 그래서 카카오, 구글 등의 사이트는 자신들이 가지고 있는 유저의 정보를 통신을 통해 조회하여 받을 수 있도록 하였고, 이를 이용해 웹사이트에 구글이나 카카오 등에 로그인하면, 그곳의 자료를 통해 사이트는 회원가입과 로그인을 처리할 수 있도록 한 것이다. 플로우는 다음과 같다.
이때 1부터 4까지의 과정을 경우에 따라 프론트엔드에서 처리할 수도 있고, 백엔드 서버가 처리할 수도 있다. 이번 프로젝트에서는 카카오를 이용한 소셜 로그인을 구현해보았다. 코드는 아래와 같다.
def get(self, request):
kakao_token = request.headers["Authorization"] #프론트엔드에서 보낸 카카오 토큰을 수령한다,
headers =({'Authorization' : f"Bearer {kakao_token}"})
url = "https://kapi.kakao.com/v2/user/me"
response = requests.request("GET", url, headers=headers)#카카오 토큰을 헤더에 넣고, 카카오 서버로 GET 요청을 보낸다. 그리고 응답을 저장한다.
user = response.json()#응답을 json으로 해석하여 저장한다. dictionary에 값이 들어가 있다.
if User.objects.filter(email = user['kakao_account']['email']).exists():
user_info = User.objects.get(email=user['kakao_account']['email'])
encoded_jwt = jwt.encode({'id': user_info.id}, SECRET_KEY, algorithm=ALGORITHM)
return JsonResponse({'message':'SUCCESS', 'accessToken' : encoded_jwt}, status = 200)#저장한 카카오 계정 정보 중 필요한 정보를 이용하여 데이터베이스에 사용자가 존재하는지 검사한다. 존재할 경우, 토큰을 만들어 보낸다.
new_user_info = User.objects.create(
email = user['kakao_account']['email'],
name = user['kakao_account']['profile']['nickname'],
image_url = user['kakao_account']['profile']['profile_image_url'],
)
encoded_jwt = jwt.encode({'id': new_user_info.id}, SECRET_KEY, algorithm=ALGORITHM)
return JsonResponse({'message':'SUCCESS', 'accessToken' : encoded_jwt}, status = 200)#데이터베이스에 사용자가 존재하지 않는 경우, 데이터베이스에 필요한 정보를 저장한 뒤, 토큰을 만들어 보낸다.
카카오의 공식 문서에도 설명을 찾아볼 수 있다. 토큰을 통해 받아올 수 있는 사용자 정보의 종류와 형식도 나와있다.
https://developers.kakao.com/docs/latest/ko/kakaologin/common