강의

멘토링

커뮤니티

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

유정렬님의 프로필 이미지
유정렬

작성한 질문수

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

Login / Logout 구현

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

작성

·

106

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 인턴입니다.

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

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

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

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

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

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

유정렬님의 프로필 이미지
유정렬

작성한 질문수

질문하기