본문 바로가기
개발/Django_python 웹 프레임워크

Blog project_Create 3 : CSRF 공격(Cross Site Request Forgery)

by 자유로운 코끼리 2020. 7. 13.
728x90

 

CSRF 공격(Cross Site Request Forgery)은 사이트 간 요청 위조 공격이라고 불리며,

인터넷 사용자(희생자)가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를

웹사이트에 요청하게 만드는 공격입니다. 잘못된 사이트에서 접속만 해도 post 요청이 사용자도 모르게

전달될 수 있습니다.

 

이 공격은 사이트가 신뢰하는 사용자를 통해 공격자가 원하는 명령을 사이트로 전송하는 기법으로

이루러지기 때문에 공격자의 IP는 추적 불가능한 특성이 있습니다.

 

다음 조건이 이뤄진 상태에서 CSRF 공격이 이루어지게 됩니다.

  • 위조 요청을 전송하는 서비스(페이스북)에 희생자가 로그인 상태
  • 희생자가 해커가 만든 피싱 사이트에 접속

예를 들명 다음과 같습니다.

  1. 사용자가 브라우저에 로그인해있다(유효한 쿠기보유).
  2. 공격자가 mail이나 게시판등을 이용해 악의적인 http request의 주소를 사용자쪽으로 전달한다. 
  3. 사용자가 해당 주소를 실행하여 원하지 않는 request를 전송하게 된다.
  4. 사용자의 인증정보(쿠키)를 사용한 스크립트가 실행된다.
  5. 서버입장에선 로그인을 거친 정상적인 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):
  

댓글