JWTを使った簡易SSOで
徐々にシステムを
リニューアルしている話
GMO Pepabo
@tsuchikazu(nessy)
2015/11/12 pepabo tech conference ec #4
JWT知っている人?
自己紹介
土屋 和良@tsuchikazu(nessy)
カラーミーショップ
http://tsuchikazu.net
AngularJS/PHP/Rails
http://www.slideshare.net/TsuchiKazu/angular-js-47156399
新しい
ショッピングカートと
既存システムとの
JWTによる

ログイン情報の受け渡
しを紹介します
新しいショッピングカート
PHP
PHP Angular +
Rails API
ショップ
ショップ
カート
カート
ログイン情報を共有したい
Client
①ログイン
②ようこそ、○さん
④ログイン状態
PHP
ショップ
Angular +
Rails API
カート
ログイン情報を共有
③カートへ
Client
PHP
ショップ
Angular +
Rails API
カート
ログイン情報を共有
③カートへ
cart.com?user_id=10
Client
PHP
ショップ
Angular +
Rails API
カート
ログイン情報を共有
③カートへ
cart.com?user_id=99
✕
改ざん
Client
PHP
ショップ
Angular +
Rails API
カート
ログイン情報を共有
③カートへ
cart.com?token=xxx
xxx:
user_id=10
Client
PHP
ショップ
Angular +
Rails API
カート
ログイン情報を共有
③カートへ
cart.com?token=xxx
xxx:
user_id=10
密結合
Client
PHP
ショップ
Angular +
Rails API
カート
ログイン情報を共有
?
少し抽象度をあげる
Microservices化??
PHP
PHP
ショップ
ショップ
カート
Angular +
Rails API
カート
???
新機能
???
おすすめ
おすすめ
ログイン情報だけじゃないかも
PHP
ショップ
ショップ
カート
Angular +
Rails API
カート
???
新機能
???
おすすめ
おすすめ
サービスから別のサービスへ
何か情報を改ざんされずに
secureに渡したい
そこでJWT
JSON Web Token
JWTが生まれた背景
A B
単純な2者間のやりとり
SSL/TLS IPSec
A B
X
改ざん/盗聴
仲介者がいる2者間のやりとり
Aさん Bさん
MTA
e.g. Mail
改ざん/盗聴
Aさん Bさん
MTA
e.g. Mail
改ざん/盗聴
署名/暗号化
by S/MIME
A service B service
Client
e.g. XML
改ざん/盗聴
署名/暗号化
by XML Signature/
Encryption
A service B service
Client
e.g. JSON
署名/暗号化
by JWT
(JWS/JWE)
改ざん/盗聴
JWTは
JSONに署名をつけたり、
暗号化するためのもの
2010∼仕様策定スタート
2015/05にRFC化
読み方は jot
Format
eyJ0eXAiOiJKV1QiLA0KICJhb
GciOiJIUzI1NiJ9
.
eyJpc3MiOiJqb2UiLA0KICJleH
AiOjEzMDA4MTkzODAsDQogIm
h0dHA6Ly9leGFtcGxlLmNvbS9
pc19yb290Ijp0cnVlfQ
.

dBjftJeZ4CVP-
mB92K27uhbUJU1p1r_wW1gF
WFOEjXk
JWTとJWSのFormat
Header Claims Set

(JSON)
Signature
● ●
base64enc({
iss: “shop-pro.jp”,
sub: “1001”,
exp: 1426420800
})
HMAC_or_RSA(
Header + ‘.’ +
Claims
, secretKey)
base64enc({
typ: “JWT”,
alg: “HMAC_RSA”
})
JWT
JWS
A service B service
Client
改ざんチェック
S S
Key Key
S
Signatureを再作成して一致チェック
H C S
H C H C
H C
JWE(暗号化)
は省略
JWT/JWS/JWEとは
• JWT = JSONをbase64 encoding して、
URL-safeにした文字列
• JWS = 署名付きJWT
• JWTと言ってるけど、JWSのことが多いので注意
• JWE = 暗号化したJWT
• でだいたいOK
どこで使われているか
• OpenID Connect の ID Token
• OAuth 2.0 JWT Bearer Token
Profile
• Twillio API, Mozilla Persona
• 他にもいっぱい
どこで使われているか
in カラーミーショップ
ログイン情報を受け渡す
Client
①ログイン
②ようこそ、○さん
③カートへ
④ログイン状態
PHP
ショップ
Angular +
Rails API
カート
JWT JWT
Key
Key
ログイン情報を受け渡す(カート)
Angular Rails API
APIでログインユーザのデータを扱う

証明書としてそのまま利用
(OAuthのフローに乗せたほうがいいかも)
JWT
Key
ログイン情報を受け渡す(カート
内)
Angular Rails API
同じサーバ間のやりとりでもOK
Key
JWT
JWT
ログイン
まとめ
• JWTを使ってsecureにJSONの受け
渡しができる
• ログインまわり以外にも使える基礎的な
もの
• 事例がまだまだ少ないので、もっとJWT
を使っていきましょう

JWTを使った簡易SSOで徐々にシステムをリニューアルしている話