DRF의 기능 중 하나인 Token Authentication에 대해 알아보기 전에 Token의 개념에 대해서 먼저 알아야 할 것이다.
Authentication은 인증이라는 뜻이다.
즉 Token을 이용한 사용자 인증을 Token Authentication이라고 한다.
우리가 사용자 인증을 할 때 Token을 이용하는 이유는 복잡하고 여러번 소통해야 하는 비효율성을 가지고 있는 SessionAuthentication을 해결하기 위함이다.
먼저 Session Authentication은 다음과 같은 과정을 보인다.
Cookie를 이용하게 되는데 Cookie는 정보를 client에 저장하고 Session은 정보를 server에 저장하게 된다. 이때 발생하는 문제는 여러가지가 있다.
Token은 이와 다르게 Token 자체로 정보를 가지고 있다. 즉, 별도의 인증을 받을 서버가 필요없기 때문에 요청받는 서버 자체에서 인증을 수행한다.
Token Authentication
방법은 위에서도 말했지만 접속한 사용자에게 어떠한 token
을 지급하고 그 암호화된 token
을 항상 가지고 있기 때문에 get혹은 post와 같은 활동을 할 때 token
을 서버에 인증시키기만 하면 접근 권한을 얻을 수 있는 것이다.
token
은 token
에 따라 권한의 일부를 조정할 수도 있어서 어떤 token
은 get만 할 수 있게 만들고, 또다른 token
은 get, post, delete 모두 할 수 있는 권한이 주어질 수도 있다.
따라서 우리는 Token Authentication
을 만들 때 각 사용자마다 token
을 create 해주는 과정을 만들어야 하고, 또한 get, post function
에 인증을 해야 하는 상황을 부여하여 로그인 했을 시에만 method
를 실행할 수 있도록 만들어야 한다.
# Authentication
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.permissions import IsAuthenticated
class PostListAPIView(APIView):
authentication_classes = [SessionAuthentication, BasicAuthentication]
permission_classes = [IsAuthenticated]
def get(self, request):
serializer = PostSerializer(Post.objects.all(), many=True)
return Response(serializer.data)
def post(self, request):
serializer = PostSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400)
먼저 다음과 같은 authentication class
에 접근을 하여 permission_classes
에 위와 같은 List
를 할당하여 만약 인증없이 접근했을 경우에는 다음과 같이 Authentication Error
가 뜰 수 있도록 만든다.
이렇게 되면 status = 403
인증 권한 에러가 발생하여 접근할 수 없다. 따라서 우리는 Token을 이용하여 현재 존재하는 admin에게 token을 할당하고 로그인을 시도해 볼 것이다.
# Django REST Framework
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
],
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10
}
# Application definition
INSTALLED_APPS = [
# Django Apps
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# My apps
'post',
# Third-Party Apps
'rest_framework',
'rest_framework.authtoken',
]
그리고 command 창에 python3 manage.py drf_create_token wbsl0427
을 입력하여 wbsl0427(자신의 아이디)에 token을 부여한 후, login을 시도한다.
그러면 다음과 같이 토큰이 생길 것이다.
Generated token fd916dfd2f11a89071ea13a71e176aab537f2d68 for user wbsl0427
이후에 login
을 하여 아까는 error
가 뜨던 페이지에 접속하면 method
가 실행 되는 것을 알 수 있다.