[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]

-[[戻る>クレームベース認証]]

* 目次 [#ld8342fd]
#contents

*概要 [#yfb13271]
-JWTとはJSON Web Tokenの略でjot(ジョット)と発音する。

-JSONのアサーション(クレーム)を生成するための仕様

--Base64 URL Encodeしたヘッダ、クレームセット等を「.」で連結したもの
---このため、url-safeであり、Webでの取り扱いが楽。
---言語毎のライブラリも整っており、相互運用が容易。

--暗号化により、鍵でペイロード(クレームセット)の改ざんチェック可能。~
この特徴のため、仲介者を伴う(改竄・盗聴の危険性がある)情報のやり取りに利用される。
---主に、認証サーバから返されるトークンに使われる。
---実際、[[OAuth]] 2.0 拡張や[[OpenID Connect]]などで使われている。

--JWTを作る方法としてJWSとJWE、もしくは両方を使った方法がある。
---JWSは、暗号化ではなく署名なので、JSON の中身は誰でも見られる。~
通常、発行者だけが秘密鍵で検証できるが、公開鍵を使用すれば誰でも検証が可能。

---JWEは、暗号化のオプション。

*構造 [#ad27d98c]

**構成要素 [#q01f4062]
以下の要素から構成される。

***ヘッダ [#m9c6f99a]
署名検証のために利用するもの。

***ペイロード(クレームセット) [#m5b94cda]

-予約済みクレーム
-パブリッククレーム
-プライベートクレーム

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

**JWTの種類 [#j5dabc60]

***JWS [#md583102]
署名されたJWT
-署名付きのデータを JSON (の Base64 URL Encode) 形式で表現するための仕様
-多くの場合は JSON Payload に対して署名するケースで利用される。
-OpenID Connect の ID Tokenなどで利用されている。

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

***JWE [#y75c2692]
暗号化されたJWT
-暗号化されたデータを JSON (の Base64 URL Encode) 形式で表現するための仕様
-暗号化された[[SAML]] アサーションを Connect に移行するユースケースなどが想定される。

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

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

***プレーンJWT [#of14a838]
[[ヘッダ>#m9c6f99a]]内のalgはnone = {“alg”: “none”} 。

ヘッダー.ペイロード.

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

***その他 [#vf919761]
-JWK
--JWS や JWE などで利用する「鍵」を JSON 形式で表現するための仕様
--OpenID Connect Discovery をサポートしている IdP は公開鍵を JWK Set 形式で公開していることが多い。

-JWA
--JWS や JWE で利用される各アルゴリズムおよびそれらの識別子を定義している仕様
--・・・

*JWTの作成と検証手順 [#dd514c38]
-難しいのでライブラリを使用する。
-JWT を扱えるライブラリは沢山ある。

**ライブラリ [#n981cbc3]
-JWS 実装時に作りがちな脆弱性パターン - OAuth.jp~
http://oauth.jp/blog/2015/03/16/common-jws-implementation-vulnerability/

-OpenID Connect の JWT の署名を自力で検証してみると見えてきた公開鍵暗号の実装の話 - Qiita~
http://qiita.com/bobunderson/items/d48f89e2b3e6ad9f9c4c

-oauth - Is there a JSON Web Token (JWT) example in C#? - Stack Overflow~
http://stackoverflow.com/questions/10055158/is-there-a-json-web-token-jwt-example-in-c

-WebCrypto APIでJSON Web Tokenの検証を試してみる - Qiita~
http://qiita.com/tomoyukilabs/items/faa66805a440f4b30cfb

|項番|言語|ライブラリのURL|h
|0|JavaScript|https://www.w3.org/TR/WebCryptoAPI/|
|1|Ruby|https://github.com/nov/json-jwt|
|2|Python|https://github.com/rohe/pyjwkest|
|3|Java|https://bitbucket.org/nimbusds/nimbus-jose-jwt/wiki/Home|
|4|PHP|https://github.com/ritou/php-Akita_JOSE|
|5|Perl|https://github.com/xaicron/p5-JSON-WebToken|
|6|Objective-C|https://github.com/yourkarma/JWT|
|7|.NETなら|Nugetからメジャーな奴を入れる。|

**JWTの作成手順 [#pfa9f0dd]

***概要 [#wbf0fb96]
-JWSまたはJWEの手順に従って生成
-入れ子になったJWTの場合には[[ヘッダ>#m9c6f99a]]の”cty”の値に”JWT”を指定

***手順(JWS) [#p744be69]
-[[ヘッダ>#m9c6f99a]]を生成し、UTF-8のバイト文字列に変換し、BASE64urlエンコード。
-クレームセットを生成し、UTF-8のバイト文字列に変換し、BASE64urlエンコード。
-BASE64urlエンコード済みの[[ヘッダ>#m9c6f99a]]とクレームセットを~
ピリオドで連結する、UTF-8バイト文字列に変換し、BASE64urlエンコード。
-上記をヘッダで指定した暗号化プロバイダで暗号化(ハッシュ or 暗号化)

**JWTの検証手順 [#r8923712]

***手順 [#ib69bb72]
-JWTを[[ヘッダ>#m9c6f99a]]、クレームセット、署名に分割しBASE64urlでデコード。
-[[ヘッダ>#m9c6f99a]]から種類(JWT、JWS、JWE)、暗号化プロバイダを確認する。
-種類、暗号化プロバイダを考慮してJWTの検証を行なう。
-検証完了後、クレームセット内の有効期限の検証も行なう。

***検証サイト [#s7ab5c53]
-JSON Web Tokens - jwt.io~
https://jwt.io/

*ユースケース [#neb31e45]

**認証用途 [#yd304024]
-JWT(JSON Web Token)を使った認証を試みる | 69log~
https://blog.kazu69.net/2016/07/30/authenticate_with_json_web_token/
-JWTを認証用トークンに使う時に調べたこと - Carpe Diem~
http://christina04.hatenablog.com/entry/2016/06/07/123000

***[[OpenID Connect]]のIDトークン [#o5f70766]
[[コチラ>OpenID Connect#ofb73c59]]を参照。

***[[OAuth]] 2.0のアクセストークン [#f9d1b3ca]
-[[OAuth]] 2.0ではアクセストークンまで仕様化されていないのでJWTを利用可能。~
[[ASP.NET Identity]]では、以下のように、アクセストークンをJWTフォーマットに変更できる。

-Implicitグラント種別のアクセストークンで、認証用途に利用する。~
アクセストークンに、[[OpenID Connect]]の[[IDトークン>OpenID Connect#ofb73c59]]を参考にして、改竄、置換、CSRF(XSRF)等に~
耐える為のクレームを追加し、これを検証すれば、Implicitグラント種別でも安全性が高くなる。

-Google の OAuth Token は、公開鍵暗号(非対称鍵暗号)で署名されたJWT であるため、~
クライアントは公開鍵を取得し、Google API に検証リクエストをしないで検証が可能。

-参考
--JSON Web Token in ASP.NET Web API 2 using Owin - Bit of Technology~
http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/
--JWT(Json Web Token)を利用したWebAPIでのCredentialの受け渡しについて | I am mitsuruog~
http://blog.mitsuruog.info/2014/08/jwtjson-web-tokenwebapicredential.html

***シングルサインオン(SSO) [#qc19ebd8]
-シングルサインオン - Wikipedia~
https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%AA%E3%83%B3

--近年は、SAMLアサーションやJWTアサーション([[OpenID Connect]]の[[IDトークン>OpenID Connect#ofb73c59]])~
によって、クレデンシャル伝えてSSOを実現する方式が一般的になってきている。

-JWTを使った簡易SSOで徐々にシステムをリニューアルしている話~
http://www.slideshare.net/TsuchiKazu/jwt-ssopepabotech

--ショップ(Webアプリ)とカート(WebAPI+SPA)を分離し、~
tempストアをサイト間で共有しないで、認証情報を共有するSSOを実現したい。

--JWTにより、以下を跨いだ認証が可能に。
---サーバー(Webアプリ・WebAPI)間
---クライアント(ブラウザ)・サーバー(Webアプリ・WebAPI)間

--また、その後の、

---マイクロサービス化にも対応可能になる。~
サービスの多様化、フロントエンドの多極化

---認証情報以外の共有したい情報にも利用することができる。~
この場合、JWEを使用する可能性がある(HTTPSなら不要だが)。

-JWT(JSON Webトークン)を使用したシングルサインオンの設定 – Zendesk Support~
https://support.zendesk.com/hc/ja/articles/203663816-JWT-JSON-Web%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%AA%E3%83%B3%E3%81%AE%E8%A8%AD%E5%AE%9A

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

-アカウント確認(E-mail confirmation)
-パスワード・リセット

**共有用URL [#w567a950]
-OneDriveのファイル・フォルダ共有にも利用されている。
-URLにオブジェクトに対する[[ACL・ACE]]的なモノをJWTアサーションに同梱。
-サービスが認証したユーザがオブジェクトに対するアクセス許可を持っているか、[[ACL・ACE]]から確認する。

**RFC [#k7337bf9]

***Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants [#e7d6a65b]
https://tools.ietf.org/html/rfc7521

-[[OAuth]] 2.0 を拡張するアサーションの仕様
--Client Authentication で Client Credentials として使うアサーションの仕様
--Authorization Codeグラント種別のAccess Token と交換するアサーションの仕様

-単体では利用できず、後の2つのサブ仕様~
(RFC7522(SAMLアサーション)、7523(JWTアサーション))~
の共通部分を抽象化した仕様になっている。

***JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants [#gc47e455]
https://tools.ietf.org/html/rfc7523

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

**参考 [#lcb2fd20]
-JSON Web Token の効用 - Qiita~
http://qiita.com/kaiinui/items/21ec7cc8a1130a1a103a

-JWTによるJSONに対する電子署名と、そのユースケース | Developers.IO~
http://dev.classmethod.jp/server-side/json-signing-jws-jwt-usecase/

*.NETのJWTライブラリ検証 [#c4fe6111]

*参考 [#p90217f2]

-JWTについて簡単にまとめてみた - hiyosi's blog~
https://hiyosi.tumblr.com/post/70073770678/jwt%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E7%B0%A1%E5%8D%98%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E3%81%BF%E3%81%9F

**RFC [#t002076b]
-IETF JOSE WG と OAuth WG から一気に9本の RFC が! - OAuth.jp~
http://oauth.jp/blog/2015/05/20/jose-and-oauth-assertion-rfcs/

***JOSE WG [#z5dc6cf2]
jose : Javascript Object Signing and Encryption

-RFC 7515 - JSON Web Signature (JWS)~
https://tools.ietf.org/html/rfc7515
-RFC 7516 - JSON Web Encryption (JWE)~
https://tools.ietf.org/html/rfc7516
-RFC 7517 - JSON Web Key (JWK)~
https://tools.ietf.org/html/rfc7517
-RFC 7518 - JSON Web Algorithms (JWA)~
https://tools.ietf.org/html/rfc7518
-RFC 7520 - Examples of Protecting Content~
Using JSON Object Signing and Encryption (JOSE)~
https://tools.ietf.org/html/rfc7520

***OAuth WG [#vdd1ecf0]
-RFC 7519 - JSON Web Token (JWT)~
https://tools.ietf.org/html/rfc7519
-RFC 7521 - Assertion Framework for~
OAuth 2.0 Client Authentication and Authorization Grants~
https://tools.ietf.org/html/rfc7521
-RFC 7522 - Security Assertion Markup Language (SAML) 2.0 Profile~
for OAuth 2.0 Client Authentication and Authorization Grants~
https://tools.ietf.org/html/rfc7522
-RFC 7523 - JSON Web Token (JWT) Profile~
for OAuth 2.0 Client Authentication and Authorization Grants~
https://tools.ietf.org/html/rfc7523

----
Tags: [[:認証基盤]], [[:クレームベース認証]]

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