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
- https://github.com/golang-jwt/jwt
- https://github.com/lestrrat-go/jwx
- https://github.com/go-jose/go-jose
Postgres
Python
-
RFC 7515 - JSON Web Signature (JWS)
-
RFC 7516 - JSON Web Encryption (JWE)
-
RFC 7517 - JSON Web Key (JWK)
-
RFC 7518 - JSON Web Algorithms (JWA)
-
RFC 7519 - JSON Web Token (JWT)
-
RFC 7520 - Examples of Protecting Content Using JSON Object Signing and Encryption (JOSE)
セキュリティチェックリスト #
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 #
Cookieであればブラウザが自動的に入れられる。
Authorization Bearerを使うならブラウザでなくてAPIアクセスするときなどに使える