コンテンツにスキップ

トークン@認証

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. JWT:JSON Web Token

JWTとは

『ヘッダー』『ペイロード』『署名』のそれぞれのJSON型データをbase64方式によってエンコードし、ドットでつないだトークン。

Bear認証やOAuthのトークンとして使用できる。

ランダムな文字列をこれら認証のトークンとするより、JWTを使用した方がより安全である。


認証での利用

▼ Form認証の場合

トークンをCookieヘッダーに割り当て、リクエストを送信する。

POST https://example.com/foo
---
cookie: Bearer <ヘッダーJSONエンコード値>.<ペイロードJSONエンコード値>.<署名JSONエンコード値>

▼ Bearer認証の場合

トークンをauthorizationヘッダーに割り当て、リクエストを送信する。

POST https://example.com/foo
---
authorization: Bearer <ヘッダーJSONエンコード値>.<ペイロードJSONエンコード値>.<署名JSONエンコード値>


JWTの作成

▼ JWT作成の全体像

JWTは以下のサイトから取得できる。

JWTの作成時に、例えばJavaScriptであれば、以下のような処理が実行されている。

// <ヘッダーエンコード値>.<ペイロードエンコード値>.<署名エンコード値>
const token =
  base64urlEncoding(header) +
  "." +
  base64urlEncoding(payload) +
  "." +
  base64urlEncoding(signature);

▼ ヘッダーのJSON型データの作成

ヘッダーは以下のJSON型データで定義される。

署名のための暗号アルゴリズムは、『HS256』『RS256』『ES256』『none』から選択できる。

const header = {
  typ: "JWT", // JWTの使用
  alg: "HS256", // 署名のための暗号アルゴリズム
};

▼ ペイロードのJSON型データの作成

ペイロードは以下のJSON型データで定義される。

ペイロードには、実際に送信したいJSONを設定する。

必ず設定しなければならない『予約済みクレーム』と、ユーザー側が自由に定義できる『プライベートクレーム』がある。

パラメーター名 対応するクレーム 役割
sub Subject 一意な識別子を設定する。 ユーザーID
iss Issuer
aud Audience
exp Expiration Time JWTの有効期限を設定する。
jti JWT ID
const payload = {
  sub: "foo",
  aud: "foo",
  iss: "https://example.com",
  exp: 1452565628,
  iat: 1452565568,
};

▼ 署名のJSON型データの作成

例えばJavaScriptであれば、以下のような処理が実行されている。

const signature = HMACSHA256(
  base64urlEncoding(header) + "." + base64urlEncoding(payload),
  secret,
);


JWTのクライアント保持

▼ 保持方法と安全度の比較

クライアント保持方法 組み合わせ おすすめ度 コメント
インメモリ、Cookieヘッダー、ローカルストレージ、セッションストレージ なし △ 〜 × いずれの方法でも、XSSによってJWTが盗まれる可能性がある。
Cookieヘッダー プリフライトリクエスト Access-Control-Max-Ageの期間内だとCSRFでJWTが盗まれる可能性がある。
Cookieヘッダー CSRFトークン
SameSiteCookie SPAとAPIが同一オリジンの必要がある。


02. fernet token

記入中...


03. branca-token

記入中...


04. PASETO

記入中...