백엔드 Back-end/장고 Django

Q. 장고django에서 post, put, delete 방식 사용 위해서 csrf 끄는 방법은?

Tap to restart 2021. 2. 19. 11:00
반응형

A. @csrf_exempt 를 사용하면 된다.

참고: csrf란? 사이트 간 요청 위조

 

API를 만들 경우 CSRF 보안이 필요하지 않다. API 서버는 API Key 등 다른 인증 방식을 사용한다.

그래서 csrf를 끌 필요가 있다.

 

출처: Cross Site Request Forgery protection

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')

 

코드 예는 다음과 같다.

from django.http import JsonResponse
from django.views import View
from django.views.decorators.csrf import csrf_exempt


@csrf_exempt
class API(View):

    def get(self, request):
        json = {'code': 'get'}
        return JsonResponse(json)

    def post(self, request):
        json = {'code': 'post'}
        return JsonResponse(json)

    def put(self, request):
        json = {'code': 'put'}
        return JsonResponse(json)

    def delete(self, request):
        json = {'code': 'delete'}
        return JsonResponse(json)

urls.py에 아래처럼 추가하면 작동한다.

urlpatterns = [
    path('api/test', api.API.as_view(), name='api'),
    ...
]

 

또는 이렇게 할 수도 있다.

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt


@csrf_exempt
def api(request):
    if request.method == "GET":
        json = {'code': 'get'}
        return JsonResponse(json)

    if request.method == "POST":
        json = {'code': 'post'}
        return JsonResponse(json)

    if request.method == "PUT":
        json = {'code': 'put'}
        return JsonResponse(json)

    if request.method == "DELETE":
        json = {'code': 'delete'}
        return JsonResponse(json)

위 경우 api 함수를 선언했으므로 아래처럼 해줘야 한다.

urlpatterns = [
    path('api/test', api.api, name='api'),
    ...
]

 

 

@csrf_exempt를 추가하지 않을 경우에는 csrf token이 필요하다는 에러가 뜨면서 post, put, delete가 작동하지 않는다.

반응형