django, template을 이용한 웹페이지 만들다가 403 뜰 때, csrf_token 추가하기

     

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 설정을 해줘야 하지만, 장고 템플릿을 사용할 경우 위 설정만 해주면 무난하게 된다.

반응형

댓글

Designed by JB FACTORY