📌 Django OAuth 리팩토링 - 2편: OAuth Callback + JWT 쿠키 연동

2025. 6. 13. 00:53·프로젝트

📌 Django OAuth 리팩토링 - 2편: OAuth Callback + JWT 쿠키 연동

✅ 네이버/깃허브 로그인 후 콜백 처리부터
✅ 최초 로그인 유저 → 닉네임 입력 → 회원가입 처리
✅ JWT를 쿠키에 심어 자동 로그인 구현까지!


🔄 1. OAuth 콜백 구조 이해

✔️ 로그인 과정

  1. /oauth/naver/login/ or /oauth/github/login/ 접속 시 → 각 플랫폼 인증 URL로 리디렉션
  2. 로그인 성공 → callback URL로 code + state 쿼리 파라미터 전달
  3. 이 값을 바탕으로 access_token 요청 및 사용자 프로필 획득

🧩 2. 콜백 뷰 리팩토링 (oauth_views.py)

🔄 기존 form 기반 → ✅ API 기반 리팩토링

class NaverLoginRedirectView(RedirectView):
    def get_redirect_url(self, *args, **kwargs):
        ...
        return f'{NAVER_LOGIN_URL}?{urlencode(params)}'

콜백 함수 예시:

def naver_callback(request):
    ...
    access_token = get_naver_access_token(code, state)
    profile = get_naver_profile(access_token)
    
    email = profile.get('email')
    user = User.objects.filter(email=email).first()

    if user:
        login(request, user)
        return set_jwt_cookie(redirect('main'), user)
    return redirect(f"{BASE_URL}/oauth/nickname/?access_token={access_token}&oauth=naver")

🌱 3. 최초 유저 닉네임 입력 처리

최초 로그인 유저는 닉네임이 없으므로 /oauth/nickname/에서 닉네임을 입력 받아 회원가입 처리한다.

@api_view(['POST'])
def oauth_nickname(request):
    access_token = request.query_params.get('access_token')
    oauth = request.query_params.get('oauth')

    ...
    serializer = NicknameSerializer(data=request.data)
    if serializer.is_valid():
        nickname = serializer.validated_data['nickname']
        profile = get_naver_profile(access_token)  # or github
        ...
        user = User(email=email, nickname=nickname, is_active=True)
        user.set_password(User.objects.make_random_password())
        user.save()
        return set_jwt_cookie(Response(...), user)

🍪 4. 쿠키 기반 JWT 인증 적용

✅ JWT + 쿠키 조합 방식

  • access_token, refresh_token을 HttpOnly 쿠키에 저장
  • 로그인 이후 클라이언트가 Authorization 헤더를 다루지 않아도 자동 인증
def set_jwt_cookie(response: HttpResponse, user: User) -> HttpResponse:
    refresh = RefreshToken.for_user(user)
    access_token = str(refresh.access_token)
    
    response.set_cookie("access_token", access_token, httponly=True, secure=not DEBUG)
    response.set_cookie("refresh_token", str(refresh), httponly=True, secure=not DEBUG)
    return response

🛡️ 5. 주의사항 & 팁

  • ❗ @csrf_exempt 제거됨 → 대신 쿠키 기반 JWT 인증이므로 CSRF 우회 가능
  • ❗ nickname은 유일성 보장 → serializer에서 validate_nickname 처리
  • 🔐 @api_view(['POST'])로 POST 기반 처리

✅ 최종 URL 구성 (oauth_urls.py)

urlpatterns = [
    path('naver/login/', NaverLoginRedirectView.as_view()),
    path('naver/callback/', naver_callback),
    path('github/login/', GithubLoginRedirectView.as_view()),
    path('github/callback/', github_callback),
    path('nickname/', oauth_nickname),
]

🧪 Swagger로 API 테스트

  • /oauth/naver/login/ → 인증 시작
  • /oauth/nickname/ → 닉네임 POST 제출
  • ✅ 자동 로그인 + 쿠키 발급까지 완료!

이제 시리즈 3 넘어갈 준비 됐어
"다음"이라고 입력하면 다음 블로그 내용 바로 정리해줄게 💪

'프로젝트' 카테고리의 다른 글

📌 Django OAuth 리팩토링 - 4편: OAuth 기반 회원가입 + 닉네임 설정 로직 리팩토링  (0) 2025.06.13
📌 Django OAuth 리팩토링 - 3편: 닉네임 중복 확인 API 구현  (0) 2025.06.13
📌 Django OAuth 리팩토링 - 1편: secret.json → .env + OAuth API 리팩토링  (0) 2025.06.13
🚀 Django 프로젝트 GitHub Actions CI/CD 구축 시 문제 해결기 (with PostgreSQL, Redis)  (0) 2025.06.11
Django 프로젝트 명령어 정리  (1) 2025.06.11
'프로젝트' 카테고리의 다른 글
  • 📌 Django OAuth 리팩토링 - 4편: OAuth 기반 회원가입 + 닉네임 설정 로직 리팩토링
  • 📌 Django OAuth 리팩토링 - 3편: 닉네임 중복 확인 API 구현
  • 📌 Django OAuth 리팩토링 - 1편: secret.json → .env + OAuth API 리팩토링
  • 🚀 Django 프로젝트 GitHub Actions CI/CD 구축 시 문제 해결기 (with PostgreSQL, Redis)
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (787)
      • Python (32)
      • 프로젝트 (110)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    youngprofessionals
    newpoliticalparty
    btsdischarge
    hotcoffeecase
    americaparty
    뷔
    btscomeback
    smartphonedurability
    trumpmuskclash
    basalcellcarcinoma
    titaniumcase
    bts
    RM
    btsreunion
    chatgpterror
    classaction
    global politics
    remittance
    btsjungkook
    life reflection
    americanlaw
    urbantrends
    travel ban
    college reunions
    lawsuitculture
    self-growth
    livebroadcast
    chinanightlife
    gpterror
    homebartrend
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
📌 Django OAuth 리팩토링 - 2편: OAuth Callback + JWT 쿠키 연동
상단으로

티스토리툴바