웹 개발을 하면 절대 무시할 수 없는 XSS, CSRF 등과 같은 보안 문제가 존재한다.
하지만 이들은 공격 방법에 대한 원리가 워낙 잘 알려졌고, 따라서 이에 대한 해결책도 쉽게 찾아볼 수 있다.
먼저 XSS의 원리와 공격 방법을 알아보고 해결방안을 유추해 본 다음 유추한 내용이 맞는지도 확인해보자.
XSS(Cross Site Scripting)
특정 웹 사이트에 임의의 스크립트를 삽입해서 공격하는 방법이다.
주로 사용자의 입력 데이터를 검증하지 않을 때 발생하게 된다.
주로 사이트의 게시판과 관련된 보안 취약점이다.
사이트의 사용자를 주로 공격하고, 스크립트 실행을 통한 유저 정보 탈취가 주 목적이다.
어떤 공격을 하는가?
- 스크립트가 포함된 게시글을 열람 시 유저가 원치않는 스크립트를 실행하게 한다.
- 유저 정보가 담긴 토큰, 쿠키 탈취
- 유저를 삭제하는 api를 호출
- 악성코드 유포 사이트로 이동시킴
<script> window.location.href = 'https://hyeo-noo.tistory.com/'; </script>
게시글에 위와 같은 스크립트가 저장되어있다면 해당 게시글을 누른 사람들은 모두 내 블로그로 오게될 것이다.
게시판에 스크립트가 있다는 말은 게시판 DB의 내용 부분에 위 스크립트가 저장되어 있다는 뜻이다.
이를 Stored XSS라고 한다.
<script> const access_token = window.localStorage.getItem('access_token'); </script>
만약 유저 정보가 들어있는 access_token가
localstorage 혹은 httpOnly가 적용되어있지 않은 COOKIE에 저장되어있다면,
위 스크립트를 통해서 access_token을 손쉽게 탈취할 수 있다.
따라서 중요한 정보는 localstorage와 httpOnly가 false인 쿠키에 저장하지말고 쿠키의 httpOnly를 설정하거나 js private variable에 저장하도록 하자.
XSS를 통해서 사용자가 원하지 않는 행동을 하도록 유도하여 정보를 빼앗아낸다면 매우 위험할 것이다.
XSS를 어떻게 방지하면 좋을까?
- <script> 를 못 쓰게 한다?
- <script> 문장의 특수문자(<)를 변조한다.
Django는 <, >, &, \, " 같은 문자열을 안전한 문자열로 바꿔주는 escape기능이 존재한다.
from django.utils.html import escape
저장할 때 위의 escape 함수로 문자열을 변환 후 저장하도록 해보자
ex) post.title = escape(request.data.get('title'))
escape사용 전에는 위처럼 스크립트 코드가 그대로 저장되어있는 모습을 볼 수 있다.
escape사용 후에는 script 관련 문자들이 모두 안전한 문자열로 바뀌어서 저장된 것을 볼 수 있다.
html.escape(text)
실제로 django에서 특수 문자열을 안전한 문자열로 바꿔주는 코드이다.
'Back-End > Django' 카테고리의 다른 글
[Django] PROJECT 홈페이지 (유저 모델, 쿼리 최적화) (2) | 2021.10.24 |
---|---|
[Django] ORM 쿼리 최적화 (select_related, annotate, aggregates) (0) | 2021.10.11 |
[Django] Google 소셜 로그인 (OAuth2.0) (13) | 2021.09.02 |
[Django] 회원정보 모델 설계 UserModel design #1 (0) | 2021.05.17 |
[Django project #2] conda + Django + mysql 개발 환경 구축하기 (2) for Mac (2) | 2021.04.28 |