CSRF 토큰이란?
Django에서 CSRF(Cross-Site Request Forgery) 공격을 방지하기 위해 CSRF 토큰을 사용합니다. CSRF 공격은 인증된 사용자의 브라우저를 악의적으로 이용하여, 해당 사용자가 원하지 않는 요청을 서버에 보내는 공격입니다. CSRF 토큰은 이러한 공격을 방지하기 위해 사용되는 보안 메커니즘 중 하나입니다.
Django에서의 CSRF
Django에는 애플리케이션의 요청과 응답을 처리하는데 사용되는 다양한 middleware가 있다. 그중 csrf 공격을 막기위한 middleware는 "django.middleware.csrf.CsrfViewMiddleware"로 구현 되어있다. 이 미들웨어는 모든 POST 요청에 대하여 CSRF 토큰을 요청하고, 토큰이 없는 경우에는 요청을 실패 처리한다.
문제상황
DRF를 활용하여 API를 개발하고 테스트하는 과정에서 Chrome 브라우저에서 해당 api를 Front End를 붙여 테스트 하였을 때 CSRF토큰이 없어 403에러가 지속적으로 발생하는 문제가 발생했다.
트러블 슈팅
1. 해당 API에 적용된 인증 클래스들에 어떤것이 있는지 확인 -> 어떠한 인증 클래스도 적용되지 않았음
2. Settings.py에 "django.middleware.csrf.CsrfViewMiddleware"가 설정되어 있는지 확인 -> 설정되어있지 않음
3. 해당 api에 @csrf_exempt() decorator를 사용하여 csrf token 인증 무효화 -> 계속 csrf token missing 에러 발생
4. DRF의 DEFAULT_AUTHENTICATION_CLASS에 아무것도 없을 때 default로 다른 인증이 적용되지 않은 api에 대하여 Session 인증을 적용한다는 사실 확인 -> 브라우저에서 처음 서버와 통신할때 CSRF 토큰을 발급 받고 Session 인증시에 CSRF 토큰 유무를 확인한다는 것을 새롭게 알게됨
5. DEFAULT_AUTHENTICATION_CLASS에 빈 리스트를 넣어 모든 api에 대한 설정을 바꾸는데 무리가 있다는 것을 고려하여 기존 settings.py를 수정하지 않음
6. Chrome이 아닌 다른 브라우저에서는 잘 작동하는 것을 확인 -> Chrome 브라우저에서 https 인증서에 문제가 있는 도메인에 대해서는 csrf토큰이 담기는 쿠키가 저장되지 않는다는 것을 알게됨
7. 사이트 설정을 변경하여 쿠키를 잘 저장하도록 한 후 문제해결
'Django' 카테고리의 다른 글
[Django] Postgresql 연동하기 (0) | 2021.02.01 |
---|---|
[Django] Django ORM - ForeignKey (0) | 2021.01.08 |
[Django] django ORM 정리 (0) | 2021.01.08 |
[Django] Django Model 새롭게 알게된 것들 정리 (0) | 2021.01.08 |
[Django] Django Admin 새롭게 안 사실 정리 (0) | 2021.01.08 |