CSRF 공격(Cross Site Request Forgery)은 사이트 간 요청 위조 공격이라고 불리며,
인터넷 사용자(희생자)가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를
웹사이트에 요청하게 만드는 공격입니다. 잘못된 사이트에서 접속만 해도 post 요청이 사용자도 모르게
전달될 수 있습니다.
이 공격은 사이트가 신뢰하는 사용자를 통해 공격자가 원하는 명령을 사이트로 전송하는 기법으로
이루러지기 때문에 공격자의 IP는 추적 불가능한 특성이 있습니다.
다음 조건이 이뤄진 상태에서 CSRF 공격이 이루어지게 됩니다.
- 위조 요청을 전송하는 서비스(페이스북)에 희생자가 로그인 상태
- 희생자가 해커가 만든 피싱 사이트에 접속
예를 들명 다음과 같습니다.
- 사용자가 브라우저에 로그인해있다(유효한 쿠기보유).
- 공격자가 mail이나 게시판등을 이용해 악의적인 http request의 주소를 사용자쪽으로 전달한다.
- 사용자가 해당 주소를 실행하여 원하지 않는 request를 전송하게 된다.
- 사용자의 인증정보(쿠키)를 사용한 스크립트가 실행된다.
- 서버입장에선 로그인을 거친 정상적인 client가 request를 수행한것이니 해당 프로세스를 수행한다.
쟝고의 csrf 공격에 대한 대응
django 에서는 이를 대응하기 위해서 CsrfViewMiddleware 를 사용합니다.
settings.py에서 이를 확인하실 수 있습니다.
# settings.py
MIDDLEWARE = [
'django.middleware.csrf.CsrfViewMiddleware',
]
이는 request 요청이 서버로 넘어와서 views 에 도달하기 전에 token을 통해서 확인합니다.
token을 확인해본 후 유효하지 않으면 403 Forbidden 에러가 발생합니다.
이때 token은 입력 form 을 입력할 때 같이 할당해줍니다.
user마다 다른 값을 부여하며 같은 user 라도 주기적으로 변경합니다.
request 요청에 대해 같이 서버로 전달 되게 됩니다.
django에서 token을 만들기 위해서는 {% csrf_token %}을 입력해주면 됩니다.
<form action="{% url 'create' %}" method="POST">
{% csrf_token %}
이는 form에서 값을 전달할 때 csrf token을 통해 정상적인 페이지에서 요청인지 확인하게 됩니다.
csrf_token은 CsrfViewMiddleware 에서 처리하며 장고 템플릿 태그에 의해서 다음과 같이 변합니다.
새로고침 시 마다 value 값이 바뀌는 걸 확인할 수 있습니다.
(구현된 페이지에서 F12를 눌러 개발자 도구에서 확인할 수 있습니다.)
get요청시 서버는 토큰과 시크릿기값을 발급하여 브라우저로 넘겨주고
post요청시 header에 토큰값을, 쿠키에 시크릿키값을 삽입하여 보내면,
서버는 csrfProtection미들웨어를 통해 유효한 토큰인지 검증한다.
Csrf_token 끄기
django rest framework 에서는 이와 관련된 view 를 모두 꺼줘야합니다.
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def create(request):
'개발 > Django_python 웹 프레임워크' 카테고리의 다른 글
Django-Static, 이미지 넣기, css 적용하기 (0) | 2020.07.15 |
---|---|
Network] HTTP 패킷 / Get, Post(feat. Django) (1) | 2020.07.15 |
[Django] render함수 vs redirect 함수 (1) | 2020.07.12 |
Blog project_CRUD 2-수정, 삭제 만들기 (0) | 2020.07.12 |
Blog project_Create 글쓰기 만들기/CRUD (0) | 2020.07.12 |
댓글