[파이썬][Django] 크로스 사이트 요청 위조 (CSRF) 방어 방법과 예제

크로스 사이트 요청 위조 (Cross-Site Request Forgery, CSRF) 공격을 방어하기 위한 방법과 예제를 설명하겠습니다. CSRF는 사용자가 의도하지 않은 액션을 취하게 하는 공격입니다.

CSRF 방어 방법

  1. CSRF 토큰 사용:

    CSRF 토큰을 사용하여 모든 중요한 POST 요청을 보호합니다. 이 토큰은 사용자 세션에 저장되며, 각 요청에 포함되어야 합니다. 서버는 요청에 포함된 토큰을 검증하여 올바른 요청인지 확인합니다. ```html


    
    Django에서는 기본적으로 CSRF 토큰을 사용하며, `{% csrf_token %}` 템플릿 태그를 사용하여 토큰을 포함시킬 수 있습니다.
    

{% csrf_token %}
2.  **SameSite 쿠키 속성 사용**:
    
    SameSite 쿠키 속성을 사용하여 쿠키가 같은 사이트에서만 전송되도록 설정합니다. 이렇게 하면 외부 사이트에서 액세스하는 경우 CSRF 공격이 어려워집니다.
    
```python
# Django 설정에서 SameSite 쿠키 속성 설정 예제
    
    CSRF_COOKIE_SAMESITE = 'Lax'
  1. HTTP Referer 검증:

    HTTP Referer 헤더를 사용하여 요청이 예상한 도메인에서 오는지 확인할 수 있습니다. 이 방법은 헤더를 신뢰할 수 있는지 확인해야 하므로 안전하지 않을 수 있습니다.

CSRF 방어 예제

Django에서 CSRF 방어를 설정한 예제를 살펴보겠습니다.

  1. CSRF 미들웨어 설정:

    Django에서는 CSRF 미들웨어가 기본적으로 활성화되어 있으므로 추가 설정이 필요하지 않습니다.

  2. POST 요청에 CSRF 토큰 포함:

    POST 요청을 보낼 때 모든 중요한 폼에 CSRF 토큰을 포함합니다.

<pre>
<code>

<form method="post" action="/my_form/">
        {% csrf_token %}
        <!-- 다른 입력 필드들 -->
        <input type="submit" value="Submit">
    </form>

</code>
</pre>
  1. SameSite 쿠키 속성 설정:

    Django 설정에서 SameSite 쿠키 속성을 설정합니다. 이것은 보안을 더 강화하는 추가 방법입니다.

# settings.py
    
    CSRF_COOKIE_SAMESITE = 'Lax'

이렇게 설정하면 Django 애플리케이션은 CSRF 공격으로부터 안전하게 보호됩니다. 요청에 포함된 CSRF 토큰을 검증하여 올바른 요청인지 확인하고, SameSite 쿠키 속성을 사용하여 쿠키가 같은 사이트에서만 전송되도록 설정합니다.