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

2025. 6. 13. 00:53·프로젝트
목차
  1. 🔄 1. OAuth 콜백 구조 이해
  2. ✔️ 로그인 과정
  3. 🧩 2. 콜백 뷰 리팩토링 (oauth_views.py)
  4. 🔄 기존 form 기반 → ✅ API 기반 리팩토링
  5. 🌱 3. 최초 유저 닉네임 입력 처리
  6. 🍪 4. 쿠키 기반 JWT 인증 적용
  7. ✅ JWT + 쿠키 조합 방식
  8. 🛡️ 5. 주의사항 & 팁
  9. ✅ 최종 URL 구성 (oauth_urls.py)
  10. 🧪 Swagger로 API 테스트

📌 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
  1. 🔄 1. OAuth 콜백 구조 이해
  2. ✔️ 로그인 과정
  3. 🧩 2. 콜백 뷰 리팩토링 (oauth_views.py)
  4. 🔄 기존 form 기반 → ✅ API 기반 리팩토링
  5. 🌱 3. 최초 유저 닉네임 입력 처리
  6. 🍪 4. 쿠키 기반 JWT 인증 적용
  7. ✅ JWT + 쿠키 조합 방식
  8. 🛡️ 5. 주의사항 & 팁
  9. ✅ 최종 URL 구성 (oauth_urls.py)
  10. 🧪 Swagger로 API 테스트
'프로젝트' 카테고리의 다른 글
  • 📌 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
  • 전체
    오늘
    어제
    • 분류 전체보기 (802)
      • Python (32)
      • 프로젝트 (115)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (154)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.