[Django] @login_required 의 동작

Humpback Whale·2024년 2월 3일
0

django

목록 보기
1/2
post-thumbnail

Django에서는 view endpoint를 로그인 유저에게만 허용되도록 @login_required 데코레이터를 통해 간편하게 적용할 수 있다.

@login_required 데코레이터는 어떻게 동작할까?

root endpoint (http://localhost:8000/) view에 @login_required 를 적용한다고 해보자.

이 경우, http://localhost:8000/ 은 로그인 하지 않은 상태에서는,
@login_reqired에 의해 http://localhost:8000/accounts/login/?next=/ 으로 리다이렉트 된다.

난 로그인에 대한 그 어떤것도 작성하지 않았음에도, @login_required를 적용하면 /account/login/?next=/ 로 자동으로 페이지가 이동하는 것이다.

이유가 뭘까?

먼저, @login_requiredsettings.py에 정의된 LOGIN_URL 값을 참조하여 url을 생성하여 해당 url로 이동하게 된다.

django.conf.global_settings.py를 보면, 다음과 같이 Default LOGIN_URL이 정의되어 있다.

LOGIN_URL = "/accounts/login/"

따라서, login url에 대한 어떤 사용자 정의가 없어도, 해당 url(http://localhost:8000/accounts/login/)로 이동하는 것이다.

그렇다면, ?next=/ 쿼리 스트링은 무엇인가?

해당 엔드포인트가 @login_required로 인해, 로그인 하지 않은 상태에서는, login 페이지로 자동으로 이동하게 된다.
로그인에 성공할 경우, 원래 접근하고자 했던 endpoint(http://localhost:8000/)로 다시 돌아갈 수 있어야 하는 것이 타당할 것이다.
이를 위해 next 라는 쿼리스트링을 자동으로 추가하여,로그인 후 처음에 접근하고자 했던 엔드포인트로 돌아가도록 만드는 것이다.

예를 들어,
http://localhost/aaa/ 엔드포인트가 @login_required로 보호된다고 해보자.
이 경우 엔드포인트 접근 시, 자동으로 http://localhost/accounts/login/?next=/aaa 로 리다이렉트 되며,
해당 로그인 페이지에서 로그인이 성공할 경우, next=/aaa 쿼리스트링을 통해 다시 http://localhost/aaa 로 리다이렉트 되는 것이다.

Class Based View인 LoginView 또한 내부적으로 url의 next 쿼리스트링으로 로그인 성공시 이동하는 페이지를 제어가능하다.

next 쿼리스트링이 존재하지 않을 경우, django.conf.global_settings.py에 정의 된

LOGIN_REDIRECT_URL = "/accounts/profile/"

로 이동하나,
url에 next 쿼리스트링이 존재할 경우, 이것이 우선한다.
즉, next 쿼리스트링을 통해 로그인 후 이동할 페이지에 대해 사용자 제어 가능하다는 것이다.

LoginView를 사용할 경우, next는 템플릿 변수로 템플릿에 전달되며, html에서 {{next}}를 통해 사용 가능하다.
로그인 폼 html 페이지에서,

<input type="hidden" name="next" value="이동하고자 하는 위치" />

를 추가할 경우, 로그폼과 함께, next 변수는 '이동하고자 하는 위치'로 전달되며, ListView는 next 변수 대로, 이동하도록 할 수 있다.
즉, 로그인 후, http://localhost/이동하고자-하는-위치 로 리다이렉트 시킬 수 있는 것이다.

나는 처음에 Django 에서 next 변수를 왜 사용하는지 잘 이해가 되지 않았다.
이제는 좀 알것같다. 그리고 이것을 통해 보다 유용하게 Django를 사용할 수 있을것 같다.

Django에서의 규칙이 존재할 경우, 이를 잘 활용할 수 있으며 적극적으로 이용해야 한다고 생각한다.


@login_required를 정리해 보자면,

  • 해당 엔드포인트 접근 시, settings.py 에 정의된 LOGIN_URL 로 이동. (login page의 url 에는 로그인 성공 시 원래 페이지로 돌아가기 위한 next 쿼리스트링이 존재.)
  • 로그인 성공 시, next 쿼리스트링에 포함된 페이지로 리다이렉트.
  • settings.pyLOGIN_REDIRECT_URL 과 next 쿼리스트링 중 next 가 우선.

0개의 댓글

관련 채용 정보