SSAMKO의 개발 이야기

[django] 데코레이터로 API에 토큰(token) 적용하기 본문

Django

[django] 데코레이터로 API에 토큰(token) 적용하기

SSAMKO 2021. 1. 20. 06:48
반응형

외부에 API를 제공할때, 해당 URI로 아무나 접근하는 것을 막기 위해 간단하게 적용할 수 있는 방법으로 크게 두 가지가 있다.

첫번째로는 django settings.py에서 ALLOWED_HOST를 수정하여, white list를 구성하는 방법이 있는데,

이 방법은 소수의 제한적 접근을 허용할때는 유용하지만, 요청할 대상이 많아지면 힘들어진다.

 

이때는 간단히 토큰을 제공하는 방법으로 해결할 수 있다.

이 토큰을 여러 method에 손쉽게 적용할 수 있도록 데코레이터를 사용했다.

 

# decorator.py
from functools import wraps

from django.core.exceptions import PermissionDenied


def check_token(func):
    """Decorator for checking whether this request is valid or not"""
    token = 'ssamko**code!'
    

    @wraps(func)
    def new_view_func(request, *args, **kwargs):
        """check ID, Password or token here"""
        if request.headers.get('Token') and request.headers['Token'] == token:
            response = func(request, *args, **kwargs)
            return response
        else:
            raise PermissionDenied
        return func(request, *args, **kwargs)
    
    return new_view_func

request.headers.get('Token')을 먼저 써주지 않으면, 

요청에 token값이 아예 없을 경우 error가 발생한다. 따라서, 먼저 token의 유무를 판단하고, 정합성을 판단하도록 작성했다.

 

PermissionDenied는 django에서 제공하는 exception중 하나로 403 forbidden 응답을 반환한다.

 

아래와 같이 view.py에 적용할 수 있다.

from django.http import HttpResponse
from django.views.decorators.http import require_http_methods

from .decorator import check_token

@require_http_methods(["GET"])
@check_token
def recommend_(request):
    name = request.GET.get('name', default='EBS')

    return HttpResponse(name)

@require_http_methods() 데코레이터로 필요한 method로만 접근하도록 제한한다. 어길 경우 405 Method Not Allowed 에러를 응답한다.

method를 먼저 체크하고, 그 다음 @check_token을 통해 토큰을 체크한다.

반응형
Comments