📌 개요
django-allauth를 도입해 카카오 OAuth2 소셜로그인을 추가한다. 기존 자체 세션 로그인은 그대로 유지하며, 두 경로 모두 동일한 Django 세션을 발급한다.
🎯 배경 / 목적
- 아이디·비밀번호 입력 부담으로 인한 초기 진입 이탈을 줄이기 위해 간편 로그인 경로를 추가한다.
- 기존 자체 계정 사용자를 강제 마이그레이션하지 않기 위해 대체가 아닌 병행으로 간다.
- OAuth2 흐름(state 검증, 토큰 교환, 사용자 정보 조회)을 직접 구현하지 않고 검증된 라이브러리에 위임한다.
- 인증 방식(세션 쿠키)은 그대로이므로 기존 16개 인증 필요 엔드포인트는 영향받지 않는다.
- 자체 계정과 카카오 계정은 완전히 분리된 별개 계정으로 취급하며, 계정 연결은 제공하지 않는다.
✅ 작업 내용
사전 준비
settings 설정
URL 연결
커스텀 어댑터 (accounts/adapters.py)
기존 엔드포인트 수정 (최소 범위)
프론트엔드
테스트
🔍 완료 조건
📎 참고
📌 개요
django-allauth를 도입해 카카오 OAuth2 소셜로그인을 추가한다. 기존 자체 세션 로그인은 그대로 유지하며, 두 경로 모두 동일한 Django 세션을 발급한다.
🎯 배경 / 목적
✅ 작업 내용
사전 준비
django-allauth==65.18.0,python-dotenv,requestsrequirements.txt갱신 및 팀원 공유http://localhost:8000/auth/social/kakao/login/callback/https://{도메인}/auth/social/kakao/login/callback/.env저장 및.gitignore확인settings 설정
INSTALLED_APPS에django.contrib.sites,allauth,allauth.account,allauth.socialaccount,allauth.socialaccount.providers.kakao추가SITE_ID = 1AUTHENTICATION_BACKENDS에ModelBackend(선순위) +allauth.account.auth_backends.AuthenticationBackendMIDDLEWARE에allauth.account.middleware.AccountMiddleware추가SOCIALACCOUNT_LOGIN_ON_GET = False— POST 폼 방식 채택 (CSRF 방어)SOCIALACCOUNT_EMAIL_REQUIRED = False,SOCIALACCOUNT_EMAIL_VERIFICATION = "none"SOCIALACCOUNT_EMAIL_AUTHENTICATION = False— 이메일 자동 계정 연결 차단 (필수)SOCIALACCOUNT_STORE_TOKENS = False— 카카오 토큰 미저장 (미결 [Feature] 카카오 로그인기능 작성 #6)LOGIN_REDIRECT_URL = "/"— 프로필 분기는GET /auth/session에 위임SOCIALACCOUNT_PROVIDERS에.env에서 읽은client_id/secret등록base.py/local.py/prod.py설정 분리 구조에 맞게 배치URL 연결
path("auth/social/", include("allauth.urls"))추가 — 기존auth/라우팅보다 뒤에 배치/auth/login,/auth/signup,/auth/logout경로가 영향받지 않는지 확인python manage.py migrate—SocialApp/SocialAccount/SocialToken테이블 생성커스텀 어댑터 (accounts/adapters.py)
DefaultSocialAccountAdapter상속 클래스 작성,SOCIALACCOUNT_ADAPTER로 등록populate_user오버라이드 → username을kakao_{uid}로 고정set_unusable_password()적용on_authentication_error오버라이드 →/login?error={code}리다이렉트KAKAO_AUTH_DENIEDSOCIAL_AUTH_FAILEDis_auto_signup_allowed확인 — 중간 가입 폼 없이 바로 생성되는지기존 엔드포인트 수정 (최소 범위)
GET /auth/session응답에login_method필드 추가POST /auth/signupusername 검증에kakao_예약어 차단 추가POST /auth/signup의login()호출에backend="...ModelBackend"명시 — 누락 시 에러POST /auth/login코드 변경 없음 — 회귀 테스트만 추가POST /auth/logout변경 없음 — unlink 미호출 방침 주석 명시프론트엔드
<form method="post">+{% csrf_token %}(
{% load socialaccount %},action="{% provider_login_url 'kakao' %}")#FEE500, 텍스트#000000D9, 심볼 포함)/login?error=쿼리 파싱 및 문구 매핑login_method === "kakao"이면 비밀번호 변경 메뉴 숨김테스트
kakao_{uid}형식으로 생성되는지 검증/login?error=로 리다이렉트되는지 검증SocialToken테이블이 비어 있는지 확인 (토큰 미저장)🔍 완료 조건
/signup/profile로 이동한다/로 이동하며 User가 중복 생성되지 않는다kakao_{kakaoId}형식이다 (카카오 닉네임이 아님)401 INVALID_CREDENTIALS가 반환된다kakao_로 시작하는 아이디로 자체 회원가입이 차단된다GET /auth/session이login_method를 정확히 반환한다📎 참고
GET /auth/session: https://app.notion.com/p/3b03308f4e7c817887abfcb1e58d97d9POST /auth/signup: https://app.notion.com/p/3b13308f4e7c81c9b653db7a36d640c1POST /auth/login: https://app.notion.com/p/3b13308f4e7c8115b1d2fd44c266425cPOST /auth/logout: https://app.notion.com/p/3b13308f4e7c813481a5e7c6ac7f8d3b