Header
JWT headerは、署名とエンコーディングに使用されるトークンタイプとアルゴリズムで構成されます。 アルゴリズムには、HMAC、SHA256、RSA、HS256、またはRS256を使用できます。
{
"typ": "JWT",
"alg": "HS256"
}
ペイロード
ペイロードは、クレームと呼ばれるセッションデータで構成されます。 私達が使用してもいい標準的な要求のいくつかは次あります,
- 発行者(iss)
- 件名(sub)
- オーディエンス(aud)
- 有効期限(exp)
- 発行時(iat)
{
"sub": "user10001",
"iat": 1569302116
}
カスタム要求は、要求セットに含めることもできます。 カスタム要求セットを使用する場合,
- 大きなデータを要求セットに入れないでください。 クレームセットはコンパクトであることを意味します。
- jwtは簡単にデコードできるので、機密情報を入れないでください。
{
"sub": "user10001",
"iat": 1569302116,
"role": "admin",
"user_id": "user10001"
}
署名
署名はJSON Web Token(JWT)の最も重要な部分です。 署名は、Base64Urlエンコードを使用してヘッダーとペイロードをエンコードし、ピリオド区切り文字で連結することによって計算されます。 これは暗号化アルゴリズムに与えられます。
// signature algorithm
data = base64urlEncode( header ) + "." + base64urlEncode( payload )signature = HMAC-SHA256( data, secret_salt )
だから、ヘッダやペイロードが変更されたとき、署名は再び計算されなければならない。 トークンの改ざんを防止する署名を計算するための秘密鍵は、Idプロバイダ(IdP)のみが持っています。
どのように動作しますか?
基本的に、idプロバイダー(IdP)はユーザー idを証明するJWTを生成し、リソースサーバーは秘密のsalt/公開鍵を使用してトークンの真正性をデコードして検証します。
- ユーザーは、ユーザー名とパスワードまたはgoogle/facebookを使用してサインインします。
- 認証サーバーは資格情報を検証し、秘密のソルトまたは秘密鍵のいずれかを使用して署名されたjwtを発行します。
- ユーザーのクライアントは、HTTP AuthorizationヘッダーでJWTを渡して、JWTを使用して保護されたリソースにアクセスします。
- リソースサーバーは、秘密のsalt/公開鍵を使用してトークンの信頼性を検証します。