TIL33 | 인가(Authorization)와 JWT
2021. 10. 26. 09:40ㆍ프로그래밍/웹관련
반응형
📃️ 인가 Authorization
- 사용자가 서버에 로그인하면 해당 사용자가 맞는지 확인하는 과정
- 유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차
- 해당 유저는 고객정보는 볼 수 있지만 수정 할 수 없다 등
- JSON Web Token(JWT) 을 통해서 Authorization을 구현할 수 있다.
access toekn
을 통해 해당 유저 정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한(permission)도 확인 할 수 있다.
인가(Authorization) 절차
- 인증(Authentication) 절차를 통해
access token
을 생성한다.access token
에는 유저 정보를 확인할 수 있는 user id같은 정보가 들어가 있어야 한다. - 유저가 request를 보낼 때
access token
을 첨부해서 보낸다. - 서버에서는 유저가 보낸
access token
을 복호화 한다. - 복호화된 데이터를 통해 user id를 얻는다.
- 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에 지정된 암호 알고리즘으로 암호화해서 전송한다. (복호화 가능!)
- 계약서에서 위변조를 막기 위해 서로 사인하는 것과 같다.
- 누구나 원본을 볼 수 있기 때문에 개인정보를 담아서는 안된다.
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"])
참고 사이트
반응형
'프로그래밍 > 웹관련' 카테고리의 다른 글
TIL35 | Westagram - API Spec & URL Design (0) | 2021.10.27 |
---|---|
TIL34 | HTTP Status Code (0) | 2021.10.27 |
TIL32 | 인증(Authentication)과 bcrypt (0) | 2021.10.26 |
TIL22 | HTTP 특징과 구조(Request / Response) (0) | 2021.10.15 |
TIL10 | 크롬 개발자 도구 - Network panel (0) | 2021.10.08 |