JWT
JWTとは、Json形式のclaims(※)を暗号化してURLで安全に送れるようにしたものです。
JWS構造のJWTを簡単に図解すると「ヘッダー」「クレームセット」「署名」の3部構成になっています
what: 文字列のみで構成されて。. で3つ、header, payload(claim), sign で構成される。
headerはjwtだよと書く
payloadはclaim(クレームセット)でissuer, subject, audience, expirationなど。
Registered Claims(任意だけど)がある。
iss: The issuer of the token
sub: The subject of the token
aud: The audience of the token
exp: This will probably be the registered claim most often used. This will define the expiration in NumericDate value. The expiration MUST be after the current date/time.
nbf: Defines the time before which the JWT MUST NOT be accepted for processing
iat: The time the JWT was issued. Can be used to determine the age of the JWT
jti: Unique identifier for the JWT. Can be used to prevent the JWT from being replayed. This is helpful for a one time use token.
signはheader,payloadにsecretを加えてhash化したもの
why: web上で運べる(urlセーフ、urlで使う文字のみで構成)、期限付きの権限を持つという証明情報を送れる
ここで、検証?ができる
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
今の理解
電子署名(公開鍵でdecode)
作ったtoken(claim(認可情報が入る場合あり)を規格によって包んだもの)の同一性を担保して認証に使うもの 暗号通信(秘密鍵でdecode)
ウェブでよくあるtokenの使い方のイメージは,
ユーザーとサイト側の両者がいて、
自分(ユーザー)のid, pwを、暗号化した通信上で、利用したいウェブサイトに送る。
サイト側は、ユーザーが必要な情報を自分の秘密鍵で暗号化したものを(json web )tokenとして返す。
tokenは、header, payload(claim set), signatureの3部分に分かれてる "."で文字列をsplitできる
header, palyload 部分は、base64encodeしただけ。
改ざんすると、signatureが invalidになる。
signatureする際に、header, payloadを含めて署名するので。
ユーザーは、そのtokenを使ってサービス使える(expireするまで)
token自体は、base64でencodeされただけなので、decodeすれば、claim部分(認可の内容)がわかる
サービス提供側からみた jwtのメリット
秘密鍵を、"複数の場所"(サーバー)でもてるので、サーバーが分散してもサービスを提供できる。
jwt固有ではないかも、、簡便ではある?
文字列がurlsafeで使いやすい?
認可情報が含まれれる場合は、bearer tokenの場合が多い? (本人確認不要)になるので、ユーザーはこのtokenを持って入れば、どこでも使える。
期限情報はあるので、
発行側は、そこで調整できる。
更新(refresh)する実装もある?
更新プロセスはわたしは理解してない。
jwt のclaims(文字列)の記述は何か
JWT の文字列ははピリオド区切りで3つの役割にそれぞれ分かれています。
header(署名に使われたアルゴリズム, これがjwtだよという宣言)
iss: tokenの発行者, sub: アプリケーション名, aud: このtokenが何に使われるかを命名, exp: expire, jti: uniqueness
url-safe: JSONで書かれた文字列, url-safe(urlで使える文字)で記述され、署名がついてる alphabet(asciiiでの), digit, -, ., _ ~
&, =, +, , / とかは、本当は?使えるけど、reserved 使用用途があるので、使わない。"~"も微妙にそうかも。
参考