Works by

Ren's blog

@rennnosuke_rk 技術ブログです

JSON Web Token(JWT)

JSON Web Tokenとは

JSON Web Token(JWT)は、署名付きJSONトークンです。ネットワーク上でやり取りされるJSON形式の文字列に署名を付加することで、JSONの改ざん検出を行うことができます。

署名

JSON文字列に対して署名を施す場合、どのように署名がなされるのでしょうか。

JSONの発行者をAさんとします。Aさんは自分だけが持つ暗号化用のキー秘密鍵JSONを暗号化しました。Aさんが発行したJSON(暗号化済み)の参照者は、JSON発行者が公開した復号用のキーである公開鍵を使って、暗号化されたJSONを復号します。

公開鍵は、対となるたったひとつの秘密鍵で暗号化された文字列を復号可能です。公開鍵による復号が上手く行った時、その文字列が対になる秘密鍵で暗号化されたことが分かります。秘密鍵を持っているのはもちろんAさんです。つまり「公開鍵で復号できる」という事実が「JSONを発行した人はAさん」であることを証明できます。

また、秘密鍵で暗号化した文字列が1ビットでも変化してしまえば、公開鍵による復号化は不可能になります。この特性から、署名によって「文字列の改ざん検出」も可能になります。

ちなみに、JSONを暗号化すると言いましたが、この行為はデータの難読化としては意味を成しません。というのも、すでに復号用の鍵は世間一般に公開されており、誰でも復号できるからです。署名による暗号・復号では改ざん検出しか行うことはできません。

また、秘密鍵が何者かに盗まれてしまえば、署名は効力を失います。悪意ある第三者がAさんになりすますことができ、任意の文字列にAさんとして署名できてしまいます。

JWTの構造

JWTは3つの構成要素からなります。

ヘッダ

データタイプや署名用のアルゴリズム等の情報を含みます。

{
  "alg": "HS256",
  "typ": "JWT"
}

ペイロード

実際にやり取りするJSON情報です。

{
  "name": "rennnosuke",
  "message": "Hello, JWT!"
}

署名

署名情報が入っています。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
) secret base64 encoded
エンコード結果

JWT.ioで好きなJSONをJWTにエンコードできます!
実際に上記JSONエンコードしてみました。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoicmVubm5vc3VrZSIsIm1lc3NhZ2UiOiJIZWxsbywgSldUISJ9.Q3ww2YF0QBKlmVHHyV07XYl3URlDSgJBTr8r83O5ddI

参考文献

JSON Web Tokens - jwt.io