Open4

JOSEについて

mitsumitsu

JOSEとは?

JavaScript環境でJWTを生成、検証、暗号化、複合化できるライブラリー。

mitsumitsu

そもそもJWT(Json Web Token)とは

Json形式とは{"name": "Sato"}のような形式。
Tokenとは暗号化された文字列。ランダムな文字列のチケットのようなもの。

流れ

  1. クライアントからユーザー情報を登録(register)する。
  2. サーバーからTokenが発行されて、それをCookieでブラウザに保存する。
  3. 次にログインする時に、Tokenを同時に持ってアクセス。サーバーがTokenを解析して、あっていればログインできる。

どのように暗号化しているのか

3つの構成から成っている。

  • Header { "alg" : "HS256"} どのような形式か?
  • Payload { "name": "Sato", "iat" : "1516..." } データの本体。iatは日付。
  • Verify Signature { your-256-secret } 署名(secretKey)。誰かにデータを改ざんされていないか確認する。
    ※上記の3つをBase64URLエンコードする。( .で区切られている。) これが最終的にTokenになる。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
mitsumitsu

SignJWT 署名付きJWTを生成するためのクラス。

  • .setProtectedHeader({ alg: 'HS256' })
    署名に使用するアルゴリズムを指定。
  • .setIssuedAt(Math.floor(Date.now() / 1000))
    トークンがいつ発行されたかを記録。発行時間は有効期限を管理するためや、不正な再利用を防ぐために使用。(現在の時刻をUnixタイムスタンプとして指定。)
  • .setExpirationTime('10seconds')
    有効期限を指定する。
  • .sign(key)
    指定した秘密鍵でトークンに署名する。署名によって内容に改ざんがないか検証できる。
mitsumitsu

jwtVerify 署名付きJWTのペイロードを抽出し検証するクラス。

export async function decrypt(input: string): Promise<any> {
  const { payload } = await jwtVerify(input, key, {
    algorithms: ['HS256'],
  })
  return payload
}

第一引数にJWTトークン、第二引数に秘密鍵、第三引数にオプションの設定オブジェクトを渡し、アルゴリズムを指定する。
検証したinputの中から、payloadを取り出して const { payload } =と宣言している。
今回は条件分岐していないが、成功したら payload を返している。