Cross-Site Request Forgery
서버사이드에서 요청의 유효성 검증을 처리하는 보안 토큰이다.
클라이언트의 POST 메소드 요청이 올 때,
요청의 데이터를 검증하기 전에 우선
그것이 어디에서 온 것이냐를 먼저 확인하는 것이다.
클라이언트 요청에 CSRF 토큰이 없거나 또는 서버의 값과 비교해서 다르다면,
클라이언트의 요청(request)은 거절된다.
www.example.com
에 로그인했다.- 결제 시, www.example.com?order_number=212121&amount=9000 형태의 POST 요청이 된다고 하자.
- 그런데 악의적인 해커에 의해
www.fake-example.com
사이트에 접속되어 있는 상태인 것이다.www.example.com
에 로그인 되어 있는 것을 알고있는 해커는 order_number와 amount를 변조한다.- 간편결제 서비스는 결제 요청이
example
에서 온 것인지,fake-example
에서 온 것인지 모르므로 그대로 결제를 진행시킨다.- 그렇게 과금이 돼 버렸다.
www.example.com
에 로그인했다.- 결제를 클릭하면 www.example.com?order_number=212121&amount=9000 의 형태로 POST 요청이 된다고 하자. 하지만 서버 측에서도 유저의 세션과 함께 관리되는 CSRF 토큰을 저장하고 있다.
- 악의적인 해커에 의해
www.fake-example.com
사이트에 접속되어 있는 상태인 것이다.- 해커가 값을 변조하여 요청을 변조했으나,
서버사이드에서
CSRF 토큰을 디코드한 값을 관리하고 있고, 해커가 요청한 값과 다르므로 요청이 실패한다.- CSRF 에러(403 Forbidden)을 발생시킨다.
https://docs.djangoproject.com/en/4.0/ref/settings/#std:setting-CSRF_FAILURE_VIEW
# views.py
def csrf_failure(request, reason=""):
"""403 Forbidden"""
logout(request)
return redirect("home")
# settings.py
if not DEBUG:
# 403 Forbidden 발생 시
CSRF_FAILURE_VIEW = "web.views.csrf_failure"