Open4
JOSEについて
JOSEとは?
JavaScript環境でJWTを生成、検証、暗号化、複合化できるライブラリー。
そもそもJWT(Json Web Token)とは
Json形式とは{"name": "Sato"}のような形式。
Tokenとは暗号化された文字列。ランダムな文字列のチケットのようなもの。
流れ
- クライアントからユーザー情報を登録(register)する。
- サーバーからTokenが発行されて、それをCookieでブラウザに保存する。
- 次にログインする時に、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
SignJWT 署名付きJWTを生成するためのクラス。
- .setProtectedHeader({ alg: 'HS256' })
署名に使用するアルゴリズムを指定。 - .setIssuedAt(Math.floor(Date.now() / 1000))
トークンがいつ発行されたかを記録。発行時間は有効期限を管理するためや、不正な再利用を防ぐために使用。(現在の時刻をUnixタイムスタンプとして指定。) - .setExpirationTime('10seconds')
有効期限を指定する。 - .sign(key)
指定した秘密鍵でトークンに署名する。署名によって内容に改ざんがないか検証できる。
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
を返している。