2차 프로젝트: 중간 정리 (1)

Hyeon Soo·2021년 3월 5일
0

2차 프로젝트에는 회원가입과 로그인을 소셜로그인으로 통합하여 코드를 작성하기로 하였다. 그 중 카카오를 이용한 소셜로그인에 대해 정리해보고자 한다.

본래 웹사이트를 이용하기 위해 회원가입을 하려면 사이트가 요구하는 정보를 일일히 작성해야 헀고, 사이트는 이 정보를 데이터베이스에 넣어야 했다. 하지만 여러 사이트가 필요로 하는 정보라는 것이 크게 다른 경우가 많지 않고, 다르다 하더라도 일부분만 다른 경우가 많다. 그래서 카카오, 구글 등의 사이트는 자신들이 가지고 있는 유저의 정보를 통신을 통해 조회하여 받을 수 있도록 하였고, 이를 이용해 웹사이트에 구글이나 카카오 등에 로그인하면, 그곳의 자료를 통해 사이트는 회원가입과 로그인을 처리할 수 있도록 한 것이다. 플로우는 다음과 같다.

  1. 로그인 할 소셜 사이트를 선택한다.
  2. 선택한 소셜 사이트 로그인에 필요한 정보를 입력한다. 이때, 정보 제공 동의 창이 뜨는 경우가 있다.
  3. 소셜 사이트 플랫폼에 요청을 보낸다.
  4. 요청의 결과로 인가코드, 혹은 토큰을 받는다. 이 토큰은 소셜 사이트에 로그인한 결과로 발급받은 토큰이다.
  5. 전달받은 토큰을 백엔드 서버에 보낸다.
  6. 백엔드 서버는 전달받은 토큰을 기반으로 토큰에 해당하는 사용자 정보를 플랫폼에 요청한다.
  7. 토큰이 정상적으로 전달 되었다면, 플랫폼에서 토큰에 해당하는 사용자 정보를 백엔드 서버로 보낸다.
  8. 받은 사용자 정보중 필요한 정보를 데이터베이스에 저장하고, 클라이언트에게 다시 토큰을 만들어 보낸다. 이때, 이미 가입한 사용자라면, 바로 토큰을 만들어 보낸다.

이때 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

0개의 댓글