인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

유정렬님의 프로필 이미지

작성한 질문수

작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지

Login / Logout 구현

로그아웃뷰 작동 관련 (2025년 3월)

작성

·

67

0

1)

앵커태그로 로그인, 로그아웃 구현하고 기존 로그인 되어있던 상황에서 로그아웃을 진행하니 에러가 발생 (405 에러)

 

2) 장고의 LogoutView 는 POST 요청만 허용함

?next={{ request.path }} 는 GET 요청으로

logout 누르면 /logout?next=/account/hello_world/ 로 GET 요청하게됨

따라서, 정상적으로 로그아웃뷰를 사용하려면

1) 로그아웃 링크를 POST 요청으로 보내는 폼으로 변경

2) LogoutView 의 설정을 변경하여 GET 요청도 허용

보안상 2는 권장되지 않는 사항이며, 1의 방법으로 처리

{% else %}
                <form action="{% url 'accountapp:logout' %}" method="post" style="display: inline;">
                    {% csrf_token %}
                    <button type="submit" class="btn btn-link" style="text-decoration: none; padding: 0; margin: 0;">
                        <span>Logout</span>
                    </button>
                </form>
            {% endif %} 

주요 변경사항

1) 로그아웃 앵커 태그를 form 태그로 변경

2) 폼의 method 를 post 로 지정

3) 이에따라 csrf 토큰 추가

 

추가로 logout 이후 redirect 경로를 설정해줘야하는데, 이는 pragmatic/settings.py 에서 설정

# Logout Redirect URL
LOGOUT_REDIRECT_URL = '/account/hello_world/'

마지막 머물렀던 페이지에서 로그아웃이 되게 하고 싶다면, 커스텀 로그아웃뷰를 만들어야하는데, 보안상 권장되지 않는다고 함.

 

 

+++

왜인지는 모르겠으나 로그인도

?next={{ request.path }} 를 먹지 않아서

pragmatic/settings.py 에서 로그인 리다이렉트 URL 을 추가하여 처리하였음

# Login Redirect URL
LOGIN_REDIRECT_URL = '/account/hello_world/'

# Logout Redirect URL
LOGOUT_REDIRECT_URL = '/account/hello_world/'

이 경우 html 템플릿에서 next 를 사용할 필요 없고 사이트 어디서 로그인하던 /account/hello_world 로 리다이렉트 시킴

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

유정렬님께서 Django에서의 로그아웃 동작 관련 문제와 해결 방안에 대해 설명해 주셨네요. 주어진 상황을 정리하고 몇 가지 주요 변경사항을 살펴보면서 올바른 방법을 설정하셨습니다.

  1. 로그아웃 구현 방법
    로그아웃을 앵커 태그 대신 폼 태그로 구현하여 HTTP POST 요청을 보낼 수 있도록 변경하셨습니다. 이는 보안을 유지하면서 405 에러를 방지하는 적절한 방법입니다.

  2. CSRF 토큰 추가
    POST 요청을 사용하기 위해 form에 CSRF 토큰을 추가하여, CSRF 공격을 방지할 수 있도록 하였습니다.

  3. 리다이렉트 설정
    로그아웃 후 특정 페이지로 리다이렉트 되도록 LOGOUT_REDIRECT_URL을 설정하였습니다. 또한 로그인 시에도 같은 방식으로 LOGIN_REDIRECT_URL을 설정하여 ?next 파라미터를 대신할 수 있게 하셨습니다.

이와 같은 설정은 보안과 사용자 경험을 모두 고려한 좋은 습관입니다. 커스텀 로그아웃 뷰를 만드는 것도 방법이 될 수 있지만, 가능하면 Django에서 제공하는 기본 기능을 활용하는 것을 권장드립니다.

추가로, 참고하실 만한 사항이 필요하시다면, Django 공식 문서를 확인하는 것도 좋은 방법입니다. 앞으로도 멋진 개발 응원합니다!