JWT

JWT (JSON Web Token) #

参考

例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

header

{
  "alg": "HS256",
  "typ": "JWT"
}

payload

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

signature

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  your-256-bit-secret
)

header, payload, signatureの3パートがあり、

signatureはheader+payloadのHashが入る。

headerはHashのアルゴリズムの種類が入る。

3つのパートそれぞれbase64でエンコードして".“でつなげるとjwtになる。

計算例

base64.standard_b64encode(b'{"alg":"HS256","typ":"JWS"}')
-> eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
base64.standard_b64encode(b'{"sub":"1234567890","name":"John Doe","iat":1516239022}')
-> eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ==
dig = hmac.new(key=b'your-256-bit-secret', msg=b'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ', digestmod=hashlib.sha256).digest()

base64.standard_b64encode(dig)
-> b'SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV/adQssw5c='

base64.urlsafe_b64encode(dig)
-> b'SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c='

pythonのbase64.urlsafe_b64encodeは、+のかわりに-を、/のかわりに_を使ってエンコードする。

base64エンコードの最後についている=はパディング。

ライブラリ #

Go

Postgres

Python

セキュリティチェックリスト #

https://github.com/shieldfy/API-Security-Checklist/blob/master/README-ja.md

IDトークンとAccessトークン #

ID Token は OpenIDから

Access Tokenは OAuth2.0から

ID TokenはJWT標準化されているがAccess Tokenは標準のものはない。

  • ID tokens are NOT meant for authorization.

  • ID tokens shoud NOT be sent o an API.

  • ID tokens do NOT have authorization information.

  • Access tokens are NOT used for authentication.

  • Access tokens do NOT guarantee that a user is logged in.

ID Token = authenticaiton, OPenID connect

Access Token = authorization, OAuth2.0

Cookieであればブラウザが自動的に入れられる。

Authorization Bearerを使うならブラウザでなくてAPIアクセスするときなどに使える