Django의 JWT 인증 구현

5192 단어 DjangoJWT인증

1. 인증 및 인증


1. 인증: 인증은 개인이나 장치 표지를 검증하는 과정이다.인증 프로세스 중 하나는 로그인 프로세스입니다.웹 사이트에 등록하면 귀하의 정보(ID, 비밀번호, 이름, 이메일 등)가 데이터베이스에 저장됩니다.이후 계정을 만들지 않아도 정보를 제공할 수 있습니다.반대로, 사용자 이름과 비밀번호만 제공하여 귀하의 신분을 검증하면 사이트는 자동으로 귀하가 방문하고 있다는 것을 알게 됩니다.
2. 권한 수여: 권한 수여는 사용자의 특권이나 방문 수준을 확정하는 데 사용되는 안전 메커니즘이다.많은 커뮤니티 사이트에서는 댓글과 관리자를 올려야만 삭제할 수 있다.다른 사람이 게시물을 삭제하려고 시도할 때 사이트는 오류를 내야 한다. (그러나 많은 경우 삭제 버튼조차 보이지 않는다.)따라서 모든 요청에 대해 사용자는 자신이 권한을 가지고 있음을 증명해야 한다.

2. JWT란 무엇인가


JSON Web 토큰(JWT)은 개방형 표준(RFC 7519)으로 정보를 JSON 대상으로 안전하게 전송할 수 있도록 치밀하고 자체적으로 포함하는 방식을 정의한다.JWT를 사용하여 요청을 인증하고 승인할 수 있습니다.
JWT는 세 개의 직렬로 연결된 Base64url 인코딩 문자열 (헤더, 유효 부하와 서명) 으로 구성되어 있으며, 점 번호 (,) 로 구분됩니다.헤더에는 영패와 암호화 알고리즘 유형에 대한 메타데이터가 포함되어 있습니다.서명은 영패의 신뢰도를 검증하는 데 쓰인다.유효 부하는 인증과 권한 수여에 필요한 모든 데이터를 포함합니다.

3. JWT 저장


사용자가 로그인하면 서버는 JWT를 생성하여 클라이언트로 보냅니다.그런 다음 클라이언트가 세션 또는 로컬 스토리지에 저장합니다.클라이언트가 인증이나 인증이 필요한 요청을 서버 측에 보낼 때마다 인증 헤더에 JWT를 보냅니다.XSS(크로스 사이트 스크립트) 공격 용이: 세션과 로컬 저장소는 JavaScript를 통해 액세스할 수 있습니다.악의적인 제3자는 JS를 사이트에 주입하여 API에 요청할 수 있다.
서버는 JWT를 쿠키에 저장하고 쿠키에 저장된 JWT를 사용하여 사용자를 검증합니다.쿠키는 모든 요청과 함께 발송되기 때문에 CSRF의 공격을 받기 쉽다.따라서 악의적인 제3자는 예상치 못한 요청을 쉽게 할 수 있다.

4. Django의 JWT


# settings.py
SECRET_KEY = 'abcde1234',
JWT_ALGORITHM = 'HS256'

# user/views.py
import json
from datetime import datetime, timdelta
from django.conf import settings
from django.http import JsonResponse
from django.views import View

import bcrypt
import jwt
from .models import User
from token_utils import user_token

class UserSignInView(View):
    def post(self, request):
        try:
            data = json.loads(request.body)
            username = data['username']
            pw_input = data['password']
            user = User.objects.filter(username=username).first()

            if user is None:
                return JsonResponse({"message": "INVALID_USERNAME"}, status=401)
            if bcrypt.checkpw(pw_input.encode('utf-8'),
                              user.password.encode('utf-8')):
                key = settings.SECRET_KEY
                algorithm = settings.JWT_ALGORITHM
                token = jwt.encode(
                    {
                        'iss': 'me',
                        'id': user.id,
                        'exp': datetime.utcnow() + timedelta(days=14)
                    }, key, algorithm=algorithm).decode('utf-8')

                response = JsonResponse(
                    {
                        'message': 'SUCCESS'
                    }, status=200
                )

                #  / Cookie , JsonResponse 
                if data.get('remember_me') is not None:
                    max_age = 14*24*60*60 # 14 days
                    expires = datetime.strftime(
                        datetime.utcnow() + timedelta(seconds=max_age),
                        "%Y-%m-%d %H:%M:%S"
                    )
                    response.set_cookie(
                        'token',
                        token,
                        max_age=max_age,
                        expires=expires,
                        httponly=True
                    )
                    return response
            return JsonResponse({"message": "WRONG_PASSWORD"}, status=401)

        except KeyError as e:
            return JsonResponse({'message': f'KEY_ERROR: {e}'}, status=400)
        except ValueError as e:
            return JsonResponse({'message': f'VALUE_ERROR: {e}'}, status=400)


# token_utils.py
import json
from django.conf import settings
from django.http import JsonResponse
import jwt
from user.models import User

def user_token(func):
    def wrapper(self, request, *args, **kwargs):
        try:
            token = request.COOKIES.get('token')
            # token = request.headers.get('token')

            key = settings.SECRET_KEY
            algorithm = settings.JWT_ALGORITHM

            if token is None:
                return JsonResponse({"message": "INVALID_TOKEN"}, status=401)

            decode = jwt.decode(token, key, algorithm=algorithm)
            request.user = User.objects.get(id=decode['id'])

        except jwt.ExpiredSignatureError:
            return JsonResponse({"message": "EXPIRED_TOKEN"}, status=400)
        return func(self, request, *args, **kwargs)
    return wrapper

이 Django의 JWT 인증 실현에 관한 글은 여기까지입니다. 더 많은 Django JWT 인증 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기