세션인증은 외부 서비스/앱에서는 사용할 수 없다는 단점이 있고, Basic인증은 외부 서비스/앱에서 매번 username/password를 넘겨야하기 때문에 보안상 위험하다는 단점이 있다.
그러므로 우리는 초기에 username/password로 Token을 발급받고, 이 token을 매 API 요청에 담아서 보내 인증을 처리하는 Token방식에 대해 공부해본다.
Token 인증 방식
TokenAuthentication를 적용하기 전에 기본적인 프로젝트 세팅을 해준다.
이미지를 업로드하는 ImageField를 사용하기 위해서는 pip install pillow를 통해 pillow를 설치해줘야 한다.
'auth_username'은 자동으로 저장하기 위해 ReadOnlyField를 사용한다.
일단 해당 ViewSet에 대해서만 Token인증을 사용하기 위해 authentication_classes에 설정해주고, permission_classes또한 IsAuthenticated로 설정한다.
마지막으로 Token인증을 사용하기 위해서는 rest_framework에서 제공하는 'authtoken' app을 INSTALLED_APPS에 추가해줘야 한다. 또한, 이는 Token이라는 모델을 지원하고 있기때문에 migrate를 해준다.
authtoken 앱에서 지원하는 Token모델
Token모델은 다음과 같은 특징이 있다.
- User model과 1대1 Relation => OneToOneField
- Token 값을 저장하는 key필드와 생성한 날짜/시간을 저장하는 created필드 존재
- 각 User별로 Token 인스턴스가 자동생성되지 않는다
- Token은 primary_key이기 때문에 유저 별로 Unique
Token 생성 방법
token을 생성하기 위해서는 ObtainAuthToken APIView에 POST 요청을 보내면 된다. 이 경우에 전에 발급된 token이 있다면 획득, 없다면 새로운 token 생성을 진행한다.