티스토리 뷰

WEB/Django

JWT(Json Web Token)

취뽀가자!! 2019. 1. 7. 14:40

JWT

JWT가 무엇인지 설명하기 전에 authentication(인증)이 어떻게 이루어지는 지 설명하겠다.


request 안의 이 유저는 어디서 오는 걸까? (request.user)


F12를 눌러보면, 


사진에 보이는 세션으로 장고에게 내가 누구인지 나타내는데 이것을 삭제하면 익명유저가 되기 때문에 url에 접속을 하려해도 Attribute가 없다고 나타날 것이다.


이는 config > settings > base에서 authentication 백엔드를 살펴보면, 2개의 백엔드를 쓰는데

AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'allauth.account.auth_backends.AuthenticationBackend',
]

모델 백엔드와 all auth 백엔드이다. 백엔드라 하면은, 승인 매커니즘을 뜻한다.


문제는 나는 세션을 쓰고, 이는 쿠키에 있다는 것이다. 내가 쿠키를 삭제하면, 망하는 것이다.

그러면, 장고는 내가 누군지 모르는 것이다. 장고가 우리의 유저를 식별하는 방법을 바꿔야 한다.


지금은 쿠키를 사용해서 유저를 식별하고 있다. 리엑트에선 쿠키를 관리하지 않을 것이다.


어드민페이지로 가서 로그인을 하면, 세션 id가 생긴다. 위의 사진 3번 째 처럼. 그러면, 이제 장고는 내가 누군지 안다. 

리엑트에서는 쿠키를 관리하기 어렵다. 리엑트 네이티브는 아예 쿠키가 없다. 


그러니, 유저 식별방법 매커니즘을 바꿔야 한다. 


장고에게 우리는 쿠키 매커니즘 말고, 다른 걸 쓸거라고 이야기 해야한다. JWT라는 것을 쓸 것이다.


JWT(json web token) 아주 쉽다. 이건 마치 쿠키와 비슷하다. 하지만 이것은 제이슨 포멧으로 되어 있다.


위 사진에 대해 설명해 보겠다.


1.브라우저는 유저명/비번을 post로 보낸다.


2. 서버는 JWT를 생성한다. 

secret (string)와 함께.


3. 이 토큰을 브라우저에게 돌려준다.


4. 이제 브라우저는 서버에 request 할 때마다, 토큰을 같이 보내야 한다.

브라우저가 디폴트로 우리를 위해서 작업을 다 해준다. 

브라우저가 우리에게 쿠키를 보내주고 있는 지 않은가?


리엑트, 리엑트 네이티브로 토큰을 받아서, 토큰과 함께 request를 보내면 된다.


5. 이렇게 서버로 토큰을 보낼 때 마다, 서버는 토큰을 받아서, 해석하고, 누군지 식별하게 돈다.


장고가 유저를 request 안에 넣는 방법은 바뀔 것이다. 지금은 쿠키로 하고 있는데, 이제 JWT로 할 것이다.


정리하자면, 


유저명,비번을 post하면, 이것이 '참'이라면 비번을 체크하고, 그 다음 토큰과 함께 돌려준다.

이 후, 서버에 request를 할 때마다 토큰도 함께 보내야 한다.

서버는 필요한 정보를 우리에게 제공할 것이다.

토큰을 통해서 우리를 식별한 후에 말이다.


변화할 내용은 base.py에 있다. 여기는 인증과정에 관련 된 것이기 때문이다.

practice(실습)


jwt에 대한 설명을 다 했으니 이제 실습을 해 보겠다.


먼저 djangorestframework-jwt를 설치해 준다.


pip install djangorestframework-jwt


그 다음 settings.py에 아래 코드를 추가해 준다.


REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), }


위 코드를 보면 디폴트로 모든 request는 승인이 필요하다고 설정해 줬다.


urls.py에 아래 코드를 추가해 준다.


from rest_framework_jwt.views import obtain_jwt_token #... urlpatterns = [ '', # ... url(r'^api-token-auth/', obtain_jwt_token), ]


이제 postman에서 확인을 해 보자.


http://localhost:8000/api-token-auth/ 로 보내주면 아래와 같이 토큰을 받을 수 있다.


이 토큰을 가지고 user의 정보를 얻어와 보겠다.



사실 아까 추가했다고 했었는데 추가라기 보다는, permission class와 authentication class를 번경했다.


REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), }


모든 api를 비공개로 바꾸었고, AUTHENTICATION_CLASSES는 jwt와 함께 동작된다.


쿠키와 같은, 이전 승인 매커니즘도 작동되긴 하지만 이상적으로는 이와 같이 많은 승인 매커니즘을 갖고있는 것이 좋다.


'rest_framework_jwt.authentication.JSONWebTokenAuthentication',

jwt는 앱(ios,android), 프런트엔드를 위해서 설치해두고, 


'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication',

나머지 베이직은 어드민을 위해서 사용하면 좋다.


'WEB > Django' 카테고리의 다른 글

Login in with Facebook  (0) 2019.01.07
로그인/로그아웃/회원가입 기능 구현  (0) 2019.01.07
The Request Object in Django  (0) 2018.12.25
Hidden Model Fields in Django  (0) 2018.12.24
Creating the URLS and Testing the images serializers  (0) 2018.12.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함