반응형

일반 회원가입은 사용자가 아이디와 비밀번호를 직접 생성해야 한다.
하지만 최근 대부분의 서비스는 Google, Kakao, Naver 같은 외부 플랫폼 계정을 이용해 간편하게 로그인할 수 있는 기능을 제공한다.
소셜 로그인(Social Login)
- 사용자가 별도의 회원가입 없이 이미 가입된 서비스의 계정을 사용하여 웹사이트나 애플리케이션에 로그인할 수 있도록 지원하는 인증 방식
- Google, Facebook, Naver, Kakao 등의 계정을 통해 다른 서비스에 접속
소셜 로그인 동작 과정
1. 사용자 동의 과정

사용자가 "카카오 로그인" 버튼을 클릭하면 카카오 로그인 페이지로 이동한다.
class KakaoSocialLoginView(View):
def get(self, request):
return redirect(
f"https://kauth.kakao.com/oauth/authorize"
f"?client_id={settings.KAKAO_REST_API_KEY}"
f"&redirect_uri={settings.KAKAO_CALLBACK_URL}"
f"&response_type=code"
)
이때 사용자는 카카오에게 다음과 같은 동의를 요청받는다.
- 이메일 정보 제공
- 프로필 정보 제공
- 기타 서비스에서 필요한 정보
사용자가 동의하면 카카오는 우리 서비스가 지정한 Callback URL로 이동시킨다.
2. 사용자 정보 조회

사용자가 동의했다고 해서 바로 사용자 정보를 받을 수 있는 것은 아니다.
OAuth 인증 과정에서는 다음 두 가지 개념이 등장한다.
- 인가 코드(authorization code)
- 사용자의 정보 조회 권한 요청이 성공했다는 것을 확인하는 임시 중개 수단
- 예시: `http://localhost:8000/users/social/kakao/callback/?code=abcd1234`
- 여기서 `code` 값이 인가 코드
- access token
- 소셜 인증 제공자(Kakao) 서버에 API 요청을 할 수 있는 권한 제공
- auth code와 access token을 분리하는 이유
- auth code를 access token으로 교환하는 과정은 인증 서버와의 직접적인 통신으로 이루어지기 때문에 access token 탈취 위험 감소
- auth code는 일회성으로 사용되고 짧은 시간만 유효
- access token이 브라우저에 직접 노출되는 것을 방지하여 보안성 높아짐
사용자
↓
Authorization Code
↓
우리 서버
↓
Access Token 요청
↓
카카오 서버
3. 회원가입 및 로그인

이제 받은 사용자 정보를 기반으로 회원가입 또는 로그인을 수행한다.
- 카카오 사용자 ID를 기반으로 사용자명을 생성
- 이미 가입된 사용자라면 바로 로그인
- 회원이 존재하지 않는 경우 새 계정 생성
- 비밀번호는 사용자가 직접 입력하지 않기 때문에 임의의 값을 생성하여 저장
- Django Session이 생성되면서 로그인 상태가 유지
class KakaoSocialCallbackView(View):
def get(self, request):
# kakao -> django
auth_token = request.GET.get("code")
# access_token 교환
response = requests.post(
"https://kauth.kakao.com/oauth/token",
data={
"grant_type": "authorization_code",
"client_id": settings.KAKAO_REST_API_KEY,
"redirect_uri": settings.KAKAO_CALLBACK_URL,
"code": auth_token,
},
headers={
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
}
)
if response.ok:
access_token = response.json().get("access_token")
# 사용자의 카카오 프로필 조회
profile_response = requests.get(
"https://kapi.kakao.com/v2/user/me",
headers={
"Authorization": f"Bearer {access_token}"
}
)
if profile_response.ok:
# 사용자 프로필 정보 => 회원가입/로그인
kakao_user_id = profile_response.json()["id"]
username = f"K#{kakao_user_id}"
try:
# 기존 회원 여부
user = User.objects.get(username=username)
except User.DoesNotExist:
# 새로 회원가입
email = profile_response.json()["kakao_account"]["email"]
user = User.objects.create_user(
username=username,
email=email,
password=str(uuid.uuid4()),
social_provider="kakao",
)
login(request, user)
return redirect("home")
return JsonResponse({"error": "Social login failed."})
카카오 애플리케이션 등록
카카오 로그인을 사용하려면 먼저 카카오 애플리케이션을 생성해야 한다.
- 카카오 개발자 사이트: https://developers.kakao.com/
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해 보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
필수 설정
- 애플리케이션 생성
- 카카오 로그인 활성화
- Redirect URI 등록
- 이메일 동의 항목 설정
- 비즈앱 전환 필요
- REST API 키 복사
[참고] 실전! Django 입문 강의
반응형