Django | 인증 & 인가 ②JWT(Json Web Token)

김민호·2021년 9월 25일
0

DJANGO

목록 보기
5/18
post-thumbnail

JWT(Json Web Token)

1. 토큰(Token) ✍🏼

2. JWT(Json Web Token)이란?

1) 개념

  • Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token
  • 인증에 필요한 정보들(JSON 객체)을 암호화 시킨 토큰
  • JWT에는 암호화된 회원정보가 들어있으며 복호화하여 사이트내의 서비스를 사용할 수 있는지 없는지를 확인하는데 사용된다 =인가(Authorizationathon)
  • 회원 인증을 해야하는 상황에서 주로 사용
  • 유저 정보를 담은 JSON 데이터를 암호화해서 client와 server 간에 주고 받는 것

2) 구조


JWT는 헤더(header), 정보(payload), 서명(signature)으로 이루어짐

헤더(header)

  • typ: 토큰의 타입을 지정. JWT
  • alg: 해싱 알고리즘을 지정. 주로 HMAC SHA256 또는 RSA 사용
    이 알고리즘은, 토큰을 검증 할 때 사용되는 signature 부분에서 사용됨

정보(payload)

  • 토큰에 담을 정보가 들어있음
  • 여기 담는 정보의 한 조각을 클레임(claim)이라고 부르고 name & values의 객체형으로 담김
  • 클레임의 정보는 등록된 (registered) 클레임, 공개 (public) 클레임, 비공개 (private) 클레임으로 세 종류

서명(signature)

  • 헤더의 인코딩값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성
  • 디코딩을 하면 누구나 헤더와 페이로드의 내용을 볼 수 있음
  • 이 부분을 만드는 슈도코드(pseudocode)의 구조
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
  )

3) 실습

  • 먼저 JWT를 위한 라이브러리 설치 후 불러오기
$ pip install PyJWT 	# 라이브러리 설치는 PyJWT
  • JWT 생성
# 파이썬 쉘 실행
import jwt 		# import할 때는 jwt

data = {'user_id':3}

>>> encoded_jwt = jwt.encode(data, 'secret', algorithm='HS256')

>>> encoded_jwt
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjozfQ.mU
nSxfiXA4zkxTrIVT3l2FRBMfTcHTLOd5oVHDaKnWo'

>>> type(token)
<class 'bytes'>
  • JWT 복호화
>>> jwt.decode(encoded_jwt, "secret", algorithms="HS256")
{'user_id': 3}

>>> type(token)
<class 'str'>

encode 할 때는 altgorithm이고, decode 할 때는 s가 붙어서 algorithms이다

인가 (Authorization)

개념

  • 유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차
  • 인가도 JWT를 통해서 구현될 수 있음
  • access token을 통해 해당 유저 정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한(permission)도 확인 가능

절차

  1. Authorization 절차를 통해 access token을 생성. access token에는 유저 정보를 확인할 수 있는 정보가 들어가 있어야 함(ex. user_id)
  2. 유저가 request를 보낼 때 access token을 첨부해서 보낸다
  3. 서버에서는 유저가 보낸 access token을 복호화한다
  4. 복호화된 데이터를 통해 user_id를 얻는다
  5. user_id를 사용해서 databases에서 해당 유저의 권한을 확인한다.
  6. 유저가 충분한 권한을 가지고 있으면 해당 요청을 처리한다
  7. 유저가 권한을 가지고 있지 않으면 에러 Unauthorized Response(401) 혹은 다른 에러 코드를 반환
profile
개발자로서의 삶은 https://velog.io/@maxminos 에서 기록하고 있습니다 😀

0개의 댓글