작성
·
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 인턴입니다.
유정렬님께서 Django에서의 로그아웃 동작 관련 문제와 해결 방안에 대해 설명해 주셨네요. 주어진 상황을 정리하고 몇 가지 주요 변경사항을 살펴보면서 올바른 방법을 설정하셨습니다.
로그아웃 구현 방법
로그아웃을 앵커 태그 대신 폼 태그로 구현하여 HTTP POST 요청을 보낼 수 있도록 변경하셨습니다. 이는 보안을 유지하면서 405 에러를 방지하는 적절한 방법입니다.
CSRF 토큰 추가
POST 요청을 사용하기 위해 form에 CSRF 토큰을 추가하여, CSRF 공격을 방지할 수 있도록 하였습니다.
리다이렉트 설정
로그아웃 후 특정 페이지로 리다이렉트 되도록 LOGOUT_REDIRECT_URL
을 설정하였습니다. 또한 로그인 시에도 같은 방식으로 LOGIN_REDIRECT_URL
을 설정하여 ?next 파라미터를 대신할 수 있게 하셨습니다.
이와 같은 설정은 보안과 사용자 경험을 모두 고려한 좋은 습관입니다. 커스텀 로그아웃 뷰를 만드는 것도 방법이 될 수 있지만, 가능하면 Django에서 제공하는 기본 기능을 활용하는 것을 권장드립니다.
추가로, 참고하실 만한 사항이 필요하시다면, Django 공식 문서를 확인하는 것도 좋은 방법입니다. 앞으로도 멋진 개발 응원합니다!