작성
·
213
1
안녕하세요!!!!!!!!ㅎㅎ 이진석 선생님!!!!! 로그인에 관해 문제가 있어서 질문드립니다!!
로그인뷰를 그대로 urls.py에 불러와서 바로 사용하고있습니다!(따로user모델은 커스터마이징하지않았습니다!)
근데 문제가 있는데 두개의 브라우저 창을 열어놓고 둘다 로그인창으로 띄어놓고 (같은 브라우저창입니다 똑같은걸 2개띄어논상태)
한브라우저에서 먼저 로그인을 하고 또 다른 브라우저 창에서(역시 로그인창이 띄어있습니다) 로그인을 하면 csrf_token 에러가 뜨는데 403 Forbidden 에러가뜹니다!
Reason given for failure:
CSRF token missing or incorrect.
제가 원하는 구현은 같은 브라우저는 이미 로그인이 되있으면 그냥 로그인에 창에 다시 로그인해도 정상적으로 페이지 넘어가게 만들고 싶습니다! (물론 같은 계정으로 로그인하며 에러없이!)
혹시 이럴경우 따로 처리하는 로직을 view에 넣어야할까요!?? (만일 csrf_exempt 사용하려면 어디에 오버라이딩 해야하는지 모르곘네용)
항상 친절한 답변 너무 감사드립니다!!!!!!!!ㅎㅎ
답변 1
1
안녕하세요.
csrf_exempt 장식자는 뷰 함수를 감싸는 방식으로 적용하실 수 있습니다. 하지만 장고 Form을 처리하는 뷰에서는 csrf_exempt 장식자를 적용하지 않으셔야 합니다. 대개 API를 처리하는 뷰에서만 적용합니다. 이미 있는 보안기능을 절대 끄셔서는 안 됩니다.
로그인 페이지를 띄우신 첫번째 탭에서 로그인을 하시면 로그인을 처리하는 과정에서 세션/쿠키가 초기화되므로, 이미 띄우두신 두번째 탭의 로그인 폼에서의 csrf token은 유효하지 않은 값이 되어버립니다.
사용자 입장에서 이를 보다 깔끔하게 처리하실려면, 로그인 폼에서는 javascript로 ajax form submit를 하시어 403 응답에서는 현재 페이지를 js로 새로고침하시면
아래의 LoginView 구현을 보시면, redirect_authenticated_user = False 옵션이 지원되고 있네요. 이 옵션을 True로 지정하시면 로그인 상황에서 login redirect url로 이동을 시켜주네요.
관련 코드 : https://github.com/django/django/blob/3.0.14/django/contrib/auth/views.py#L48
화이팅입니다. :-)