본문 바로가기
Dev/Web

Django에서의 CSRF, XSS

by DUSTIN KANG 2023. 12. 3.

금일 포스팅에서는 웹 개발에서 알아두어야할 XSS, CSRF 보안 문제에 대해서 포스팅할 예정이다.

 

XSS(Cross Site Scripting)

XSS 공격은 웹 사이트에 스크립트를 삽입하여 쿠키나 개인정보를 빼돌리는 해킹 기법이다. 

주로 사용자의 입력 데이터를 검증하지 않을 때 발생하며 게시판 앱을 제작할 때 발생하는 보안 문제점이다.

 

XSS 해킹 기법

 

이외에도 유저를 삭제하는 API를 호출한다거나 특정 웹사이트로 이동시키는 등 공격을 한다.

그렇다면 위 문제를 어떻게하면 해결할 수 있을까?

 

이스케이프(Escape)를 활용한다.

만약 공격자가 악의적인 목적으로 스크립트를 작성했을 때, 렌더링 시 자동으로 이스케이프를 하게 만들 수 있다.

즉, 게시물을 렌더링 할 때, `<script>` 태그를 문자 형태로 만들어버리는 방법이다. 

 

from django.utils.html import escape

def app_create(request):
    """
    Post 데이터 생성하기
    """
    if request.method == 'POST':
        title = escape(request.POST.get('title'))
        content = escape(request.POST.get('content'))

물론 '&,<,>,",\' 같은 특수 문자는 `replace`를 통해 변경해주어야 한다.

 

그러나 해당 공식 문서를 참조하면 완벽하게 안전한 방법이 아니다.

검증되지 않은 자바 스크립트가 실행된다면  취약점을 막을 다른 방법도 찾아봐야 한다.

 

Django의 템플릿은 문자열 변수 값을 렌터링할 때 자동으로 이스케이프 처리를 한다고 한다.

 

HttpOnly 옵션을 주자.

쿠키를 설정할 때 HttpOnly 옵션을 주는 것이다. 위 옵션을 주면 Javascript를 통한 접근을 막고 오직 서버 전송만 가능하게 하는 것이다.

 

CSRF(Cross site Request Forgery)

사용자의 의지와 무관하게 공격자가 의도한 행위를 웹사이트에 요청하게 만드는 해킹기법이다. 

결국엔 해당 링크를 통해 유저가 링크 누르기만 했는데 POST 요청이 전송되어 서버에게 보내지는 것이다.

 

CSRF 공격

 

 

 

Django의 기본적인 CSRF 방지 메커니즘은 다른 웹프레임워크가 세션에 토큰을 저장하는 방식과 달리 CSRF 토큰을 쿠키에 저장하는 방식이다.  `<form>`이란 태그를 이용해 POST 요청을 보낼 경우라면 `{% csrf_token %}` 태그를 사용하거나 Ajax의 경우 `X_CSRFToken` 헤더에 설정함으로써 유효한 POST 요청을 판단할 수 있다.

 

뷰에서는 항상 CSRF 토큰이 쿠키로 설정할 수 있게 `@ensure_csrf_cookie` 데코레이터를 설정하는 방법이 있다.

 `@csrf_exempt` 데코레이터는 특정 뷰의 CSRF 보호를 꺼버리는 데코레이터인데 CSRF를 지원하지 않거나 필요하지 않는 외부 서비스나 API와 통합할 때 필요하다.

만약, Django에서 백엔드 서버로 사용하고 CSRF 토큰을 생성해 context에 추가하여 이를 프론트엔드로 전달하여 토큰을 HTTP 요청 헤더에 포함시키는 방법이다.

from django.middleware.csrf import get_token

# CSRF 토큰 생성
csrf_token = get_token(request)

# 이 토큰을 프론트엔드로 전달하고, 프론트엔드에서 HTTP 요청 헤더에 포함시켜 사용

 

 

추가로 Django의 CSRF 방지 메커니즘 관련해서 IT 엘도라도님의 블로그에 자세히 설명이 되어있으니 참고하면 좋겠다.

Reference

https://it-eldorado.tistory.com/141

https://hyeo-noo.tistory.com/224

https://docs.djangoproject.com/en/4.2/topics/security/

https://itstory.tk/entry/CSRF-공격이란-그리고-CSRF-방어-방법

'Web' 카테고리의 다른 글

쿠키(Cookie)와 세션(Session)  (0) 2023.12.05