JWT(JSON Web Tokens)란❓

이상민·2021년 2월 24일
0

1. access token

  • HTTP는 stateless이므로 사용자가 인증을 했는지 확인하기 위해서는 요청에 해당 정보를 포함해야한다

  • 인증에 성공했을 때 백엔드가 응답에 access token을 포함하고 프론트엔드는 쿠키 등에 저장한다. 이후 요청 시 access token을 첨부해 전송하는 형태로 인증을 거친 사용자인지 확인할 수 있다

  • 전송시 평문 데이터를 사용하면 해킹의 가능성이 있기 때문에, 암호화한 토큰을 사용해야한다


2. JSON Web Tokens

  • access token을 생성하는 방법 중 하나로, JSON 데이터를 토큰으로 변환한다
  • 요청으로 JWT이 들어오면 백엔드는 이를 복호화해 JSON 데이터를 얻는다
  • JWT는 백엔드 서버가 생성한 JWT인지 아닌지 확인하는 검증 기능도 제공한다

2-1. JWT 구조

  • header
  • payload
  • signature
xxxxx.yyyyy.zzzzz

x = header, y = payload, z = signature

⚠️ signature외에는 암호화 되어있지 않으므로 민감한 데이터는 저장하지 않도록 해야한다 ⚠️
⚠️ JWT는 올바른 토큰인지에 대한 검증만하지 데이터 자체를 암호화하지 않는다 ⚠️

2-2. header

  • 해시 알고리즘과 토큰 타입을 명시한다. Base64URL 방식으로 코드화한다.
{
 "alg": "HS256"
 "typ": "JWT"
}

Base64URL : URL 주소로 사용가능하도록 URL에서 특별한 의미를 가지는 특수문자를 제외한 Base64
Base64 : 8비트 이진 데이터를 ASCII 영역 문자로만 이뤄진 문자열로 바꾸는 인코딩 방식

2-3. payload

  • 전송하고자 하는 데이터 부분. Base64URL 방식으로 코드화한다.
{
 "user_id": 2
 "exp" : 1539517391
}

2-4. signature

  • JWT를 검증할 때 사용하는 부분. JWT secret을 헤더에 지정된 암호 알고리즘으로 암호화한다.

3. PyJWT

  • 파이썬에서 JWT를 구현할때 사용하는 라이브러리이다
pip install PyJWT
>>> import jwt
>>> data_to_encode = {'some': 'payload'}
>>> encryption_secret = 'secret'
>>> algorithm = 'HS256'
>>> encoded = jwt.encode(data_to_encode, encryption_secret, algorithm=algorithm)
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzb21lIjoicGF5bG9hZCJ9.Joh1R2dYzkRvDkqv3sygm5YyK8Gi4ShZqbhK2gxcs2U'
>>> jwt.decode(encoded, encryption_secret, algorithms=[algorithm])
{'some': 'payload'}
  • 실제로 사용시에는 rainbow table attack을 방지하기 위해 더 복잡한 encryption secret을 사용해야한다
profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글