기술블로그-Django편
📌 Django 로그인 후 리디렉션 - next 파라미터 완전 정복
Chansman
2025. 5. 7. 14:04
📌 Django 로그인 후 리디렉션 - next 파라미터 완전 정복
✅ 1. 상황 설명
Django에서 @login_required 데코레이터가 적용된 페이지에 로그인하지 않은 사용자가 접근하면, 자동으로 로그인 페이지로 리디렉션됩니다.
이때 URL에 ?next=/원래_주소/가 자동으로 붙습니다.
🔍 2. 흐름 요약
예시 상황:
- 사용자가 /blog/create/ 페이지 접근
- @login_required에 의해 로그인 필요
- Django가 자동으로 이동:
/accounts/login/?next=/blog/create/
- 로그인 성공 시:
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를 구현할 수 있습니다. 😉