기술블로그-Django편

📌 Django 로그인 후 리디렉션 - next 파라미터 완전 정복

Chansman 2025. 5. 7. 14:04

📌 Django 로그인 후 리디렉션 - next 파라미터 완전 정복


✅ 1. 상황 설명

Django에서 @login_required 데코레이터가 적용된 페이지에 로그인하지 않은 사용자가 접근하면, 자동으로 로그인 페이지로 리디렉션됩니다.
이때 URL에 ?next=/원래_주소/가 자동으로 붙습니다.


🔍 2. 흐름 요약

예시 상황:

  1. 사용자가 /blog/create/ 페이지 접근
  2. @login_required에 의해 로그인 필요
  3. Django가 자동으로 이동:
/accounts/login/?next=/blog/create/
  1. 로그인 성공 시:
next = request.GET.get('next')
if next:
    return redirect(next)

➡ 원래 보려던 페이지로 이동


✅ 3. 코드 설명: request.GET.get('next')

next = request.GET.get('next')  # URL 쿼리 파라미터에서 'next'를 가져옴

구성 요소 설명

request.GET 사용자가 요청한 GET 방식의 쿼리 파라미터 (dict 형태)
.get('next') 딕셔너리에서 'next' 키의 값을 안전하게 가져옴

➡ get이 두 번 나온 이유는, 하나는 객체(GET), 하나는 메서드(dict.get())이기 때문입니다.

예시:

# URL: /login/?next=/blog/create/
request.GET = {'next': '/blog/create/'}
request.GET.get('next')  # → '/blog/create/' 반환

✅ 4. @login_required가 어떻게 next를 만드는가?

  • @login_required는 내부적으로 사용자가 접근한 URL을 기억합니다.
  • 인증되지 않은 경우 LOGIN_URL로 리디렉션하면서 next=원래주소를 자동으로 추가합니다.
  • 이 덕분에 로그인 후 원래 페이지로 돌아갈 수 있습니다.

기본 설정:

# settings.py
LOGIN_URL = '/accounts/login/'  # 또는 커스터마이징 가능

🔁 전체 흐름 요약 다이어그램

[ 사용자가 /blog/create/ 접근 ]
        ↓
[ @login_required 인증 확인 ]
        ↓
[ 로그인 안 되어 있음 → /accounts/login/?next=/blog/create/ 이동 ]
        ↓
[ 로그인 성공 → next 파라미터 꺼냄 ]
        ↓
[ redirect(next) → /blog/create/ 복귀 ]

🧠 결론 정리

항목 설명

@login_required 인증이 안 된 사용자를 로그인 페이지로 보냄
?next=... 원래 접근하려던 URL이 자동 추가됨
request.GET.get('next') 로그인 성공 후 리디렉션 URL 추출
redirect(next) 원래 페이지로 돌아감

이 기능을 이용하면 사용자의 흐름을 끊지 않고 자연스럽게 로그인 → 원래 페이지로 복귀시키는 UX를 구현할 수 있습니다. 😉