JWTとJOSEについて簡単にまとめる

2598 ワード

OAuthにおけるアクセストークンについて調べていると、JWTとJOSEというワードを見かけます。
JWTに加えて、なぜさらにJOSEというややこしそうな仕様が必要なのかわからなかったため調べました。
主に、ヘッダーに着目すると、その違いやJOSEの目的を理解することができました。

おさらい: JWTについて

  • JSON Web Tokenの略称である
  • ヘッダーとペイロード(送受信したいデータ)のJSONオブジェクトをBase64 URL エンコードした文字列である
  • Base64 URL エンコードしている理由は、HTTPヘッダー、URLクエリパラメータなど様々なデータの送受信方法に対応するためである
  • ヘッダーとペイロードのみだと検証の仕組みがなくヘッダーとペイロードをBase64 URL エンコードすれば生成できてしまうため悪用が可能で、この課題を解決する必要がある
# デコードされたヘッダー
{
  "typ": "JWT", # データの形式
  "alg": "none" # 署名に使ったアルゴリズム
}

本題: JOSEとは

  • JSON Object Signing and Encryptionの略称である
  • JOSEの仕様はJSON オブジェクトの署名(JSON Web Signatures: JWS)、暗号化(JSON Web Encryption: JWE)、鍵格納フォーマット(JSON Web Keys: JWK)を提供している
  • JWTトークンの生成者が署名をし、受信者が改ざんされていないことを検証するための仕様である
    • JWTの検証の仕組みがなくヘッダーとペイロードをBase64 URL エンコードすれば生成できてしまうため悪用が可能という課題を解決することが目的である
  • 公開鍵暗号方式による署名をする場合かトークンの生成者と受信者で下記の処理が必要となる
    1. トークン生成者が秘密鍵を用いてでヘッダーとペイロードに署名をする
    2. トークン受信者は公開鍵のURLから公開鍵を取得し、署名が改ざんされていないことを検証する
# デコードされたヘッダー
{
  "typ": "JWT", # データの形式
  "alg": "RS256", # 署名に使ったアルゴリズム
  "kid": "RsaKeyId" # 鍵のID(Key ID)
}

参考

  • 『OAuth徹底入門 セキュアな認可システムを適用するための原則と実践』