개발일지/# Django
[Django] CSRF 방지
lution88
2022. 1. 29. 23:38
CSRF(cross site request forgery) 는 간단히 말하면 웹 사이트에서 유저가 서버로 요청을 보내는 행위를 악의적으로
변경해서 요청을 전송하는 것이다. 즉, 내가 요청하지 않은 일인데 내가 요청한 것처럼 처리되는 것!!
위조가 일어날 수 있는 경우
- 유저가 보안이 취약한 사이트에 로그인을 한다. 아이디와 패스워드등의 유저 입력을 받아서 서버로 전송해야 하니까 폼(Form)을 사용.
- 서버가 유저가 전송한 정보를 보고 이 유저가 정상유저임을 인증한다. 로그인이 성공한 상태.
이때 보이지 않지만 서버로부터 인증된 유저라는 정보가 유저에게도 전달되게 된다.
이 정보를 사용해서 서버는 매번 로그인을 요청 하지 않고도 이 유저가 로그인 한 유저라는 것을 식별하는 것이다. - 이 상태에서 유저가 로그아웃 하지 않은 채, 악성 사이트로 이동한다. (우리가 웹 서핑을 할 때 흔히 하는 동작)
- 그러면 이제 악성 사이트에서 다음과 같은 유저의 정보를 가져오거나, 돈을 송금하는 등의 요청을 전송하는 폼을
누르게 하거나 해당 폼을 굳이 작성하지 않아도 자동으로 전송 되는 형태로 요청을 시도한다.
action을 보면 지금 악성 사이트에서 취약한 사이트로 요청을 보내고 있다는 걸 알 수 있다.
크로스 사이트 요청이 일어나는 부분. - 요청을 보낼 때 유저가 가지고 있는 인증정보도 함께 서버로 전송된다.
- 취약한 사이트에서는 인증된 유저가 보낸 요청이므로 요청을 수행하게 된다.
Django의 CSRF 방지
장고는 CSRF 위조 방지를 기본 기능으로 제공한다.
위조 방지 토큰을 삽입하고 검증하는 과정을 간단하게 구현한다.
{% csrf token %} 템플릿 태그를 적어주면 된다.