TIL33 | 인가(Authorization)와 JWT

2021. 10. 26. 09:40프로그래밍/웹관련

반응형

📃️ 인가 Authorization

  • 사용자가 서버에 로그인하면 해당 사용자가 맞는지 확인하는 과정
  • 유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차
    • 해당 유저는 고객정보는 볼 수 있지만 수정 할 수 없다 등
  • JSON Web Token(JWT) 을 통해서 Authorization을 구현할 수 있다.
    • access toekn을 통해 해당 유저 정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한(permission)도 확인 할 수 있다.

 

인가(Authorization) 절차

  1. 인증(Authentication) 절차를 통해 access token을 생성한다.
    access token에는 유저 정보를 확인할 수 있는 user id같은 정보가 들어가 있어야 한다.
  2. 유저가 request를 보낼 때 access token을 첨부해서 보낸다.
  3. 서버에서는 유저가 보낸 access token을 복호화 한다.
  4. 복호화된 데이터를 통해 user id를 얻는다.
  5. user id를 사용해서 database에서 해당 유저의 권한(permission)을 확인하고 권한이 있으면 해당 요청을 처리한다.

 

📃️ JWT (JSON Web Token)

access token을 생성하는 방법은 여러가지가 있는데, 그 중 가장 널리 사용되는 기술중 하나가 바로 JWT(JSON Web Tokens)이다.

JSON파일 안에 필요한 데이터를 넣어서 Web Token으로 주고 받는 것으로 이런 절차의 목적은 해당 유저가 매번 로그인 하지 않도록 하는 것이다.

 

JWT 구조

:: headers

  • 사용하는 해시 알고리즘과 토큰의 타입
  • {'alg' : 'HS256', 'typ' : 'jwt'}

:: payload (내용)

  • 클라이언트와 서버 간 주고 받는 데이터
    • 유저 정보가 노출되면 안된다. 예를 들어 password, email 등.
    • user_id는 데이터베이스에 접근 권한이 없는 한 의미없는 데이터이기 때문에 상관없다.
  • {'user_id' : 1, 'exp' : 1539517391}

:: signature (서명)

  • JWT가 원본 그대로라는 것을 확인할 때 사용하는 부분
    • 인코딩한 header + payload 그리고 서버의 secret key를 이용해서 header에 지정된 암호 알고리즘으로 암호화해서 전송한다. (복호화 가능!)
  • 계약서에서 위변조를 막기 위해 서로 사인하는 것과 같다.
  • 누구나 원본을 볼 수 있기 때문에 개인정보를 담아서는 안된다.

 

jwt process

 

Install

pip install pyjwt

 

Usage

encode()

encode(
        self,
        payload: Dict[str, Any],
        key: str,
        algorithm: Optional[str] = "HS256",
        headers: Optional[Dict] = None,
        json_encoder: Optional[Type[json.JSONEncoder]] = None,
    ) -> str
import jwt

# jwt token
encoded_jwt = jwt.encoded({'user_id': 5}, 'secret', algorithm='HS256')

decode()

decode(
        self,
        jwt: str,
        key: str = "",
        algorithms: List[str] = None,
        options: Dict = None,
        **kwargs,
    ) -> Dict[str, Any]
import jwt

# jwt token
encoded_jwt = jwt.encoded({'user_id': 5}, secret, algorithm='HS256')
jwt.decode(encoded_jwt, "secret", algorithms=["HS256"])

 

참고 사이트

PyJWT

반응형