[Django] CSRF와 보안
작성:    
업데이트:
카테고리: Django
태그: BE Framework, Django
사이트 간 요청 위조(CSRF)
CSRF : Cross-Site Request Forgery
- 웹 App 취약점 중 하나
- 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동 수행
-
특정 웹페이지를 보안에 취약하게 하거나 수정, 삭제 등의 작업을 하게 만든다.
- Django는 CSRF에 대항하여 middleware와 template tag를 제공
CSRF 공격 방어
Security Token 사용 방식(CSRF Token)
- 사용자의 데이터에 임의의 난수 값 부여
- 매 요청마다 해당 난수 값을 포함시켜 전송
- 서버에서 요청을 받을 때마다 전달된 token값 유효성 검사
적용 범위
- 일반적으로 데이터 변경이 가능한 POST, PATCH, DELETE method
- GET method는 제외
Django와 CSRF
- Django는 CSRF token 템플릿 태그 제공
csrf_token template tag
{% csrf_token %}
- CSRF 보호에 사용
- form 태그에 작성
- input type이 hidden으로 작성
- value는 Django에서 생성한 hash값으로 설정
- 해당 태그 없이 요청을 보내면 Django 서버는 403 forbidden 응답
활용 예시
<form action="{% url 'articles:create' %}" method="POST">
{% csrf_token %}
<label for="title">제목 :</label>
...
</form>
CsrfViewMiddleware
- CSRF 공격 관련 보안 설정 : settings.py-MIDDLEWARE에 작성되어있다.
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
- 요청 과정에서 urls.py 이전에 Middleware의 설정 사항들을 순차적으로 거친다.
- 응답 과정은 반대로 하단에서 상단으로 Middleware 적용
Middleware
- 공통 서비스 및 기능을 App에 제공하는 SW
- 데이터 관리, App 서비스, 메시징, 인증 및 API 관리 등 처리
- 개발자들이 App을 보다 효율적으로 구축할 수 있도록 지원
- App, 데이터 및 사용자 사이를 연결하는 요소처럼 작동
댓글남기기