CSRF token

hyuckhoon.ko·2021년 12월 14일
0

❶ CSRF 란?

Cross-Site Request Forgery

서버사이드에서 요청의 유효성 검증을 처리하는 보안 토큰이다.
클라이언트의 POST 메소드 요청이 올 때,
요청(request)의 데이터를 검증하기 전에 우선
그것이 어디에서 온 것이냐를 먼저 확인하는 것이다.

클라이언트 요청에 CSRF 토큰이 없거나 또는 서버의 값과 비교해서 다르다면,
클라이언트의 요청(request)는 거절된다.


❷ CSRF 토큰 미적용 시나리오

  1. www.example.com에 로그인했다.
  2. 결제 시, www.example.com?order_number=212121&amount=9000 형태의 POST 요청이 된다고 하자.
  3. 그런데 악의적인 해커에 의해 www.fake-example.com사이트에 접속되어 있는 상태인 것이다.
  4. www.example.com에 로그인 되어 있는 것을 알고있는 해커는 order_number와 amount를 변조한다.
  5. 간편결제 서비스는 결제 요청이 example에서 온 것인지, fake-example에서 온 것인지 모르므로 그대로 결제를 진행시킨다.
  6. 그렇게 과금이 돼 버렸다.

❸ CSRF 토큰 적용한 시나리오

  1. www.example.com에 로그인했다.
  2. 결제를 클릭하면 www.example.com?order_number=212121&amount=9000 의 형태로 POST 요청이 된다고 하자. 하지만 서버 측에서도 유저의 세션과 함께 관리되는 CSRF 토큰을 저장하고 있다.
  3. 악의적인 해커에 의해 www.fake-example.com사이트에 접속되어 있는 상태인 것이다.
  4. 해커가 값을 변조하여 요청을 변조했으나, 서버사이드에서 관리하고 있는 CSRF 토큰 값까진 알 수 없다.
  5. CSRF 에러(403 Forbidden)을 발생시킨다.

❹ 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"

0개의 댓글