Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

JWTとはJSON Web Tokenの略でjot(ジョット)と発音する。

仕様

用途

種類

JWTを作る方法としてJWSとJWE、もしくは両方を使った方法がある。

注意

「Base64」ではなく「Base64 URL」なので「=」は含まれない。

構造

構成要素

以下の要素から構成される。

ここの詳細は、RFCを参照。

個別に、

などを参照のこと。

ヘッダ

署名検証のために利用するもの。

基本的なもので、

とか。

ペイロード(クレームセット)

署名

色々な暗号化アルゴリズムを使用して作成した署名

JWTの種類

JWS

署名されたJWT

BASE64URL (UTF-8 (Header))
.
BASE64URL (UTF-8 (Claim Set))
.
BASE64URL (UTF-8 (Signature))

JWE

暗号化されたJWT

ヘッダー.キー.初期ベクター.暗号文.認証タグ

BASE64URL (UTF-8 (JWE Protected Header))
.
BASE64URL(JWE Encrypted Key)
.
BASE64URL(JWEInitialization Vector)
.
BASE64URL(JWE Ciphertext)
.
BASE64URL(JWE Authentication Tag)

プレーンJWT

ヘッダ内のalgはnone = {“alg”: “none”} 。

ヘッダー.ペイロード.

BASE64URL (UTF-8 (Header))
.
BASE64URL (UTF-8 (Claim Set))
.

その他

JWTの作成と検証手順

ライブラリ

項番言語ライブラリのURL
0JavaScripthttps://www.w3.org/TR/WebCryptoAPI/
1Rubyhttps://github.com/nov/json-jwt
2Pythonhttps://github.com/rohe/pyjwkest
3Javahttps://bitbucket.org/nimbusds/nimbus-jose-jwt/wiki/Home
4PHPhttps://github.com/ritou/php-Akita_JOSE
5Perlhttps://github.com/xaicron/p5-JSON-WebToken
6Objective-Chttps://github.com/yourkarma/JWT
7.NETならNugetからメジャーな奴を入れる。

JWTの作成手順

概要

手順(JWS)

JWTの検証手順

手順

検証サイト

ユースケース

認証用途

OpenID ConnectのIDトークン

コチラを参照。

OAuth 2.0のアクセストークン

コチラを参照。

シングルサインオン(SSO)

メール着信確認トークン

以下でメール着信確認トークンを使用するようなケースで利用する事で、
トークンをtempストアに格納して、後に比較するような実装が不要になる。

共有用URL

RFC

Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants

https://tools.ietf.org/html/rfc7521

JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants

https://tools.ietf.org/html/rfc7523

JWT を RFC 7521(上記) の アサーション として利用するための仕様

参考

.NETのJWTライブラリ

相性がある模様

System.IdentityModel.Tokens.JwtSecurityTokenHandler

Microsoft Open Technologiesによって開発された、
JSON Web Token Handler For the Microsoft .Netというライブラリ。

下記が参考になる。

上記は、ResourcesOwner?であるユーザが介在することなく
ClientがResourcesServer?のAPIを利用するようなユースケースらしく、
以下の様な、grant_typeで、AccessToken?を取得して、WebAPIにアクセスする。

この時、Googleの秘密鍵のキー長は1024bitだが、
このライブラリは最低でも2048bitを要求しているため、

相互運用が不可だったらしい。

恐らく、色々なライブラリ間の実装差異で
相互運用が難しくなるようなケースがあると思う。

Microsoft.Owin.Security.Jwt.JwtFormat

以下の2メソッドのインターフェイスを確認すると、
引数・戻り値に、Microsoft.Owin.Security.AuthenticationTicket?が在ったり、
.NET技術と結合度が高く、相互運用には向かないように見える。

検索結果

JSON Web Token (JWT) implementation for .NET

Version Historyを参照。

System.IdentityModel?.Tokens.Jwt

以前は、JSON Web Token Handler For the Microsoft .Netという表示名だったようだが、
version 05-00からは、パッケージ名(=名前空間)と同じ表示名になっている。
ライセンスはMITだが、ソースコードをGithubやCodePlex?上に確認できない・・・。

上記の、BCL入りしているJwtSecurityTokenHandler?が含まれる名前空間より
一つ下の階層のJWT系の追加ライブラリを格納する名前空間であるもよう。

必要に応じて、追加でNugetから取得する必要がある。

詳しくは、Version Historyを参照。

自作ライブラリについて

以下を考慮して開発可能。

用途

相互運用(検証・復号化)

他のライブラリでも検証・復号化が可能かどうかは、
JSON Web Tokens - jwt.ioなどのサイトを使用して確認すると良い。

Base64urlエンコード・デコード

このライブラリも必要になる。

署名・暗号化アルゴリズム

特定用途であれば、上記サイトにも、.NETにも実装されている

署名・暗号化アルゴリズムを使用すると良い。

認証であれば公開鍵暗号化方式のRS256(RSA using SHA-256 hash)が良い。

脆弱性

実装に脆弱性を作らないように注意する。

ざっくり、

ということらしい。

後者は、

検証でtrueになるJWTを生成できてしまう模様。

特定用途の自作ライブラリであれば、
署名と検証のalgは固定にしておくのも良いと考える。

参考サイト

ちなみに、

は、

が記載されていない。

また、

は、いくつか誤りがあるようで、RS256は、HMACSHA256ではない。

故に、(実際にGoogle側での検証ができているので)こちらのほうが参考になる。

ココを見ると、

これで、実際にGoogle側での検証ができている。

秘密鍵・公開鍵のキーペアを、

検討(検証)する必要が出てくる。

(・・・RFCを正確に理解していないとライブラリ作成は難しい)。

参考

RFC

JOSE WG

jose : Javascript Object Signing and Encryption

OAuth WG


Tags: :認証基盤, :クレームベース認証, :暗号化


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS