Django의 쿠키, 세션, Token

7769 단어
쿠키: 사용자의 신분을 식별하고 세션 추적을 하기 위해 사용자의 로컬에 저장된 데이터(일반적으로 암호화됨)를 기대하고 있으며, 서버에서 생성되어 클라이언트 브라우저에 전송되며, 브라우저는 쿠키를 키/value로 저장하고, 다음 요청은 같은 사이트에서 이 쿠키를 서버에 전송한다.
Django  cookie:  response.set_cookie( , ,max_age= ),          
    
Django cookie:  request.COOKIE.get( ) 

Session: 클라이언트가 서버에 있는 신분 표식은 무상태의 지속적인 메커니즘으로 저장 공간이 필요합니다.session은 쿠키에 의존하여 존재하고 값을 감별하는 형식으로 서버에 저장되며 내용은 암호화됩니다.
저장 방법:
 1.관계형 데이터베이스
 2.캐시--- 로컬 메모리
 Django   session,   redis      
        1.  setting.py
        2. :request.session[ ]= 
        3. :request.session.get( )

sesion의 저장 및 가져오기 흐름도
   :      A  ====>1.        session, session["name"] = "AAA"
                                                   2.           (     )
                                                   3.     redis   =====>  :   
                                                                    :     
                                                                    :     :{"name":"AAA"} #  redis          name:AAA
        
                                                   4.             cookie ===>  :   
                                                                                                 :session_id
                                                                                                 :     (    )
                                                                            
                                                   5.                 session      
                                
   :             cookie  
        
   :             ,            cookie  (  session_id)
            ====>1.     cookie,     session_id
                       2.  session_id          
                       3.       ,    , redis       (     {"name":"ywk"})
                       4.    ,  session     

JWT: 사용자가 등록하거나 로그인한 후에 우리는 사용자의 로그인 상태를 기록하거나 사용자를 위해 신분인증의 증빙을 만들고 싶습니다.우리는 더 이상 Session 인증 메커니즘을 사용하지 않고 Json WebToken 인증 메커니즘을 사용합니다.
JWT를 사용하는 이유:
Http 프로토콜은 무상태 프로토콜이기 때문에 만약에 사용자가 우리 응용 프로그램에 사용자 이름과 비밀번호를 제공하여 사용자 인증을 한다면 다음 요청을 할 때 사용자는 다시 사용자 인증을 해야 한다. http 프로토콜은 어느 사용자가 보낸 요청인지 알 수 없기 때문에 응용 프로그램이 어느 사용자가 보낸 요청인지 식별할 수 있도록 서버에 사용자 로그인 정보를 저장할 수 있다.이 로그인 정보는 응답할 때 브라우저에 전달되고 쿠키로 저장되어 다음 요청 시 사용자가 응용 프로그램에 접근할 때 요청이 어느 사용자로부터 왔는지 식별할 수 있도록 합니다. 이것이 바로session 인증을 사용하는 이유입니다.
그러나 서로 다른 클라이언트의 증가로 인해 독립된 서버는 더 많은 사용자를 불러올 수 없고session을 사용하면 더 많은 문제점을 드러낼 수 있다. 예를 들어
확장성: 사용자가 인증한 후에 서버에서 인증 기록을 하면 기록은 메모리에 저장되고 사용자가 다음에 요청할 때 이 서버에서 권한을 부여받은 자원을 받아야 한다. 이렇게 하면 분포식 응용에서 부하 균형기의 능력을 제한하고 필요한 확장 능력을 제한한다.
CSRF: 도메인 간 위조 요청, 브라우저의 쿠키 캡처, 악성 요청 전송
이럴 때는 토큰의 감권 메커니즘을 사용해야 돼요.
Token: 서비스 측에서 생성한 문자열은 유일한 표지가 있다.사용자가 처음 로그인한 후 서버에서 Token을 생성하여 이 Token을 클라이언트에게 되돌려줍니다. 나중에 클라이언트가 다시 데이터를 요청할 때 이 Token만 가지고 가면 사용자 이름과 비밀번호를 다시 가지고 갈 필요가 없습니다.
프로세스:
  1.사용자 이름 및 암호를 사용하여 서버 요청
  2.서버에서 사용자 정보 확인
  3.서버가 인증을 통해 사용자에게 token을 보냅니다
  4.클라이언트가 Token을 저장하고 요청할 때마다 이 Token 값을 첨부합니다
  5.서비스 측에서 Token을 검증하고 데이터를 되돌려줍니다
JWT의 구성: 헤드(headler) 하중(payload) 비자(signature), 헤드는 HMAC SHA256의 알고리즘으로 암호화하고 나머지 2개는 base64의 알고리즘으로 암호화한다.
JWT 사용: Django에서 Django REST 프레임워크 JWT 확장을 사용하여 수행합니다.
문서 웹 사이트:http://getblimp.github.io/django-rest-framework-jwt/
다음 절차를 따르십시오.
1. 설치:
 
pip install djangorestframework-jwt

 
2. 구성:
#        :JWT session
'DEFAULT_AUTHENTICATION_CLASSES': (
    #        jwt  
    'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    #   admin    session
    'rest_framework.authentication.SessionAuthentication',
),
}
  
#      10  
JWT_AUTH = {
  # timedelta    
    'JWT_EXPIRATION_DELTA': datetime.timedelta(hours=10),
  }
  • JWT_EXPIRATION_DELTA는 Token의 유효기간을 가리킨다
  • 3. 사용
    사용자 대상을 만들 때 수동으로 Token을 생성합니다
    from rest_framework_jwt.settings import api_settings
    
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
    
    payload = jwt_payload_handler(user)
    token = jwt_encode_handler(payload)

    4. 서열화에서 필드 추가 토큰을 정의합니다
    from rest_framework_jwt.settings import api_settings
    
    # class CreateUserSerializer(serializers.Serializer): ... # token token = serializers.CharField(label=' token', read_only=True) ... def create(self, validated_data): """ """ user=User() ... user.save() # token jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) user.token = token return user

    전재 대상:https://www.cnblogs.com/xiaolu915/p/10529413.html

    좋은 웹페이지 즐겨찾기