python-JWT(Json Web Token)-pyjwt

11900 단어
JWT 도입
전통 로그 인 인증 절차: 
1. 사용자 가 처음 로그 인 할 때 하나의 token 을 생 성하 여 프론트 데스크 에 되 돌려 주 고 사용자 의 홈 키 와 함께 백 엔 드 서버 (데이터베이스 또는 캐 시 중) 에 저장 합 니 다. 2. 다음 에 로그 인 할 페이지 를 방문 할 때 token 을 함께 전송 합 니 다. 3. 백 엔 드 에서 token 을 들 고 데이터베이스 나 캐 시 에 이 token 이 존재 하 는 지 확인 하고 존재 하면 인증 을 통과 합 니 다. 그렇지 않 으 면 인증 이 통과 되 지 않 습 니 다.
전통 인증 의 단점:
1. token 에 배경 이 존재 하고 저장 과 읽 기 비용 이 증가 합 니 다. 2. 여러 배경 서버 가 존재 할 때 token 을 동기 화하 여 공유 해 야 합 니 다. 귀 찮 습 니 다.
JWT 인증 절차 (전통 인증 문 제 를 해결):
1. 사용자 가 처음 로그 인 할 때 token 을 만 들 지만 배경 에 token 을 저장 하지 않 습 니 다.
2. 다음 로그 인 할 페이지 를 방문 할 때 token 과 함께 전송
3. 배경 에서 token 을 들 고 분석 과 검 사 를 하고 분석 에 성공 하면 인증 이 통과 되 며 그렇지 않 으 면 인증 이 통과 되 지 않 습 니 다.
JWT 암호 화 원리:
생 성 된 token 은 세 부분 으로 나 뉘 는데 그것 이 바로 HEADER. PAYLOAD. SIGNATURE 입 니 다. 이 세 부분 은 모두 역 알고리즘 base 64 암호 화 된 문자열 입 니 다. 마지막 으로 점 (.) 으로 연결 합 니 다. 예 를 들 어:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

1. HEADER
암호 화 알고리즘 과 token 형식 을 대표 합 니 다. 지정 한 것 을 표시 하지 않 으 면 기본 값 은 {"alg": "HS 256", "typ": "JWT"} 입 니 다. 암호 화 된 결 과 는 eyJhbGCIJIUzI1NiIsInR5cCI6IkpXVCJ 9 입 니 다.
2. PAYLOAD
전송 하고 자 하 는 업무 정보 와 token 의 만 료 시간 (선택 가능) 을 대표 합 니 다. 예 를 들 어 {"sub": "1234567890", "name": "John Doe", "iat": 1516239022, "exp": 4515411} 암호 화 후 결 과 는 eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI 6 IkpvaG4gRG9lIiwiaWF0IjoxNTE2mjM5MDIfQ 입 니 다.
3. SIGNATURE
JWT 의 관건 은 앞의 두 단락 을 암호 화한 후의 밀 문 에 사용자 정의 소금 값 을 더 해서 연결 하 는 것 이다. 그 다음 에 불가 역 알고리즘 HS 256 (HEADER 의 알고리즘 을 구체 적 으로 사용) 을 통 해 암호 화 한 다음 에 이 밀 문 을 가 역 알고리즘 base 64 로 암호 화 합 니 다.
소금 값 (salt): 암호 화 할 때 추 가 된 사용자 정의 문자열 을 말 합 니 다. 무 작위 또는 난잡 한 문자열 이 좋 습 니 다. 암호 화 된 문자열 의 유일 성 을 확인 할 수 있 습 니 다. django 에 서 는 settings 의 SECRET 를 사용 할 수 있 습 니 다.KEY
암호 화 된 결과: SflKxwRJSmeKKF2QT4fwpMeJf36POk6yJVadQssw5c
JWT 복호화 원리:
요청 에서 전 달 된 token 을 받 은 후: 1. 번 호 를 누 르 면 token 으로 나 누고 3 단 값 을 받 습 니 다. 2. 이 3 단 밀 문 을 base 64 복호화 하고 명문 에서 암호 화 알고리즘 과 업무 데이터, 만 료 시간 을 받 습 니 다. 3. 앞의 두 단락 의 밀 문과 사용자 정의 소금 값 을 다시 연결 합 니 다. (이 소금 값 은 token 을 만 들 때의 소금 값 과 같 아야 합 니 다)HEADER 의 알고리즘 을 사용 하여 암호 화 4. 암호 화 된 결 과 를 받 은 token 의 세 번 째 복호화 명문 과 비교 하고 완전히 일치 하면 인증 성공 을 설명 하 며 일치 하지 않 으 면 token 이 변경 되 었 고 인증 에 실 패 했 음 을 설명 합 니 다.
JWT 3 단 식 사고:
JWT 의 근본 사상 은 업무 데 이 터 를 불가 역 알고리즘 을 통 해 암호 화하 여 token 에 저장 하 는 것 이다. 그러면 왜 3 단 식 으로 이렇게 복잡 하 게 만들어 야 합 니까?업무 데 이 터 를 소금 값 으로 직접 추가 하고 기본 불가 역 알고리즘 으로 비밀문서 문자열 을 만들어 전송 하면 되 지 않 겠 습 니까?이렇게 암호 화 할 때 는 비교적 간단 하지만 복호화 할 때 역 알고리즘 이 없어 서 그 중의 업무 데 이 터 를 가 져 올 수 없 기 때문에 업무 데 이 터 를 따로 저장 해 야 한다. JWT 는 암호 화 알고리즘 을 저장 하 는 데 사용 되 는 부분 을 추가 하여 사용자 가 구체 적 으로 어떤 알고리즘 을 사용 하여 암호 화 를 하 는 지 확인 하고 확장 성 을 높 일 수 있다.
python 에서 JWT 사용 하기
pyjwt
이것 은 python 이 JWT 를 사용 하 는 기본 패키지 입 니 다. jwt 홈 페이지 에서 python 언어 가 가장 많은 것 은 pyjwt 입 니 다. 설치 방식 은 다음 과 같 습 니 다.  pip install pyjwt , 이 가방 은 암호 화 와 복호화 의 논 리 를 다 썼 습 니 다. 암호 화 알고리즘 / 업무 데이터 / 소금 값 만 입력 하면 됩 니 다.
rest 에서framework 에서 pyjwt 사용 하기
두 개의 인 터 페 이 스 를 정의 합 니 다. 로그 인 (login) 과 주문 (order) 을 볼 수 있 습 니 다. 로그 인 한 사용자 만 이 주문 인 터 페 이 스 를 볼 수 있 습 니 다. 로그 인 인터페이스 에서 로그 인 에 성공 하면 jwt 의 암호 화 token 으로 돌아 갈 수 있 습 니 다. 주문 인터페이스 에서 인증 류 를 사용자 정의 하고 인증 류 에서 token 을 검사 할 수 있 습 니 다.
1. urls. py 편집
from django.urls import path
from users import views

urlpatterns = [
    path('login/', views.LoginView.as_view()),
    path('order/', views.OrderView.as_view()),
]

2. 로그 인 및 주문 보기 클래스 편집
1. 로그 인 성공 후 token 획득 방법 create 호출token (), 사용자 정보 와 token 만 료 시간 (단위: 분), 기본 1 분
2. 주문 보기 클래스 에 인증 클래스 설정 JWTAuthentication
3. create_token 과 JWTAuthentication 은 모두 utils 패키지 의 JWTAuth. py 에 정의 되 어 있 습 니 다.
from rest_framework.views import APIView
from rest_framework.response import Response
from utils.JWTAuth import create_token, JWTAuthentication

class
LoginView(APIView): def post(self, request, *args, **kwargs): # name = request.data.get('name') pwd = request.data.get('pwd') # User try: user = models.User.objects.filter(name=name, pwd=pwd).first() except Exception: return Response({'status': 1, 'errmsg': ' !'}) # token token = create_token({'id': user.id, 'name': user.name}, 1) # return Response({'status': 0, 'token': token}) class OrderView(APIView): authentication_classes = [JWTAuthentication, ] def get(self, request): return Response({'status': 0, 'msg': 'ok'})

3. JWTAuth. py 편집
import jwt
from jwt import exceptions as JWTException
from django.conf import settings
import datetime
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed

def create_token(payload, timeout=1):
    #                    
    payload['exp'] = datetime.datetime.utcnow() + datetime.timedelta(minutes=timeout)
    #     
    salt = settings.SECRET_KEY
    #           HS256
    token = jwt.encode(payload=payload, key=salt)
    return token

class JWTAuthentication(BaseAuthentication):
    def authenticate(self, request):
        #  url     token
        token = request.query_params.get('token')
        #   
        salt = settings.SECRET_KEY
        #   token
        try:
            payload = jwt.decode(jwt=token, key=salt, verify=True)
        except JWTException.ExpiredSignature:
            raise AuthenticationFailed('token   ')
        except jwt.DecodeError:
            raise AuthenticationFailed('token    ')
        except jwt.InvalidTokenError:
            raise AuthenticationFailed('   token')

        return payload.get('name'), token

메모: 만 료 시간 을 설정 할 때 payload 세그먼트 에서 설정 하고 키 이름 은 'exp' 로 고정 되 어 있 습 니 다. 값 은?  datetime.datetime.utcnow() + datetime.timedelta(xxxx)

좋은 웹페이지 즐겨찾기