django, template을 이용한 웹페이지 만들다가 403 뜰 때, csrf_token 추가하기
- Study/python
- 2022. 3. 26. 16:15
403은 보통 권한이 없을 때 나오는 에러이지만, csrf 때문에 발생하는 경우도 생긴다.
장고와 템플릿을 이용해 웹 페이지를 만들 때 로컬에서 403이 뜨면 아마도 csrf 때문일 것이다. 보통 따른 인증을 안 만드니까 ㅎㅎ 만약 oauth 2.0이나 기타 인증을 넣었다면 그쪽에서 에러가 날 수도 있다.
이 에러를 막기 위해서는 템플릿에서 api를 호출할 때 csrf_token값을 넘겨줘야 하는데, 일단 이 csrf_token을 사용하기 위해서는 미들웨어에 추가해야 한다.
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
중간에 django.middleware.csrf.CsrfViewMiddleware를 추가해주자. 미들웨어라는 게 순서도 중요하기 때문에 만약 넣어도 안되면 살짝 위치를 바꿔보자. auth.middleware보다 위에 있으면 아마 될 거임
이제 template 쪽에서 api를 호출할 때 데이터로 csrfmiddlewaretoken을 넣어주면 된다
# html head 쪽에 아래 코드 추가
{% csrf_token %}
# 폼 데이터일 경우
fd.append('csrfmiddlewaretoken', "{{ csrf_token }}")
# ajax일 경우
data : {
...
csrfmiddlewaretoken: "{{ csrf_token }}"
...
}
이러면 에러가 나지 않을 거다.
만약 프론트엔드 소스를 장고 템플릿이 아니라 다른 프레임워크(리엑트나 뷰나 플러터 등)로 만들었다면 좀 더 복잡한 crsf 설정을 해줘야 하지만, 장고 템플릿을 사용할 경우 위 설정만 해주면 무난하게 된다.
반응형
'Study > python' 카테고리의 다른 글
내 포트폴리오 사이트 만들어서 AWS에 올리기 2편. docker, nginx, uwsgi 사용하기 (25) | 2022.05.08 |
---|---|
내 포트폴리오 사이트 만들어서 AWS에 올리기 1편. Django, startbootstrap, AWS, EC2 (5) | 2022.05.08 |
Pycharm community 버전에서 django 프로젝트 생성 (0) | 2021.08.10 |
Python에서 switch문 사용하기. if ~ elif 그만하고 싶을 때 ㅋㅋㅋ (0) | 2021.03.19 |
Django(장고)에서 form을 이용한 style 활용법 (0) | 2021.02.03 |