マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay都元ダイスケ Miyamoto
マイクロサービスが話題を集め、コンポーネントの急速な API 化が進んでいます。
認証や認可は、主にエンドユーザとシステムの間の問題だと認識されますが、今やコンポーネント間のサービス呼び出しにおいても重要な役割を担っています。
複雑に入り組んだマイクロサービス間の認証と認可について、実際に開発している API プラットフォームの実例を元に、実践的な知見をお伝えします。
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay都元ダイスケ Miyamoto
マイクロサービスが話題を集め、コンポーネントの急速な API 化が進んでいます。
認証や認可は、主にエンドユーザとシステムの間の問題だと認識されますが、今やコンポーネント間のサービス呼び出しにおいても重要な役割を担っています。
複雑に入り組んだマイクロサービス間の認証と認可について、実際に開発している API プラットフォームの実例を元に、実践的な知見をお伝えします。
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matchingharmonylab
公開URL:https://arxiv.org/pdf/2404.19174
出典:Guilherme Potje, Felipe Cadar, Andre Araujo, Renato Martins, Erickson R. ascimento: XFeat: Accelerated Features for Lightweight Image Matching, Proceedings of the 2024 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) (2023)
概要:リソース効率に優れた特徴点マッチングのための軽量なアーキテクチャ「XFeat(Accelerated Features)」を提案します。手法は、局所的な特徴点の検出、抽出、マッチングのための畳み込みニューラルネットワークの基本的な設計を再検討します。特に、リソースが限られたデバイス向けに迅速かつ堅牢なアルゴリズムが必要とされるため、解像度を可能な限り高く保ちながら、ネットワークのチャネル数を制限します。さらに、スパース下でのマッチングを選択できる設計となっており、ナビゲーションやARなどのアプリケーションに適しています。XFeatは、高速かつ同等以上の精度を実現し、一般的なラップトップのCPU上でリアルタイムで動作します。
セル生産方式におけるロボットの活用には様々な問題があるが,その一つとして 3 体以上の物体の組み立てが挙げられる.一般に,複数物体を同時に組み立てる際は,対象の部品をそれぞれロボットアームまたは治具でそれぞれ独立に保持することで組み立てを遂行すると考えられる.ただし,この方法ではロボットアームや治具を部品数と同じ数だけ必要とし,部品数が多いほどコスト面や設置スペースの関係で無駄が多くなる.この課題に対して音𣷓らは組み立て対象物に働く接触力等の解析により,治具等で固定されていない対象物が組み立て作業中に運動しにくい状態となる条件を求めた.すなわち,環境中の非把持対象物のロバスト性を考慮して,組み立て作業条件を検討している.本研究ではこの方策に基づいて,複数物体の組み立て作業を単腕マニピュレータで実行することを目的とする.このとき,対象物のロバスト性を考慮することで,仮組状態の複数物体を同時に扱う手法を提案する.作業対象としてパイプジョイントの組み立てを挙げ,簡易な道具を用いることで単腕マニピュレータで複数物体を同時に把持できることを示す.さらに,作業成功率の向上のために RGB-D カメラを用いた物体の位置検出に基づくロボット制御及び動作計画を実装する.
This paper discusses assembly operations using a single manipulator and a parallel gripper to simultaneously
grasp multiple objects and hold the group of temporarily assembled objects. Multiple robots and jigs generally operate
assembly tasks by constraining the target objects mechanically or geometrically to prevent them from moving. It is
necessary to analyze the physical interaction between the objects for such constraints to achieve the tasks with a single
gripper. In this paper, we focus on assembling pipe joints as an example and discuss constraining the motion of the
objects. Our demonstration shows that a simple tool can facilitate holding multiple objects with a single gripper.
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
基礎からのOAuth 2.0とSpring Security 5.1による実装
1. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Pivotal認定講師が解説!
基礎からのOAuth 2.0と
Spring Security 5.1による実装
(株)カサレアル 多⽥真敏
2018年10⽉31⽇
JSUG Spring Fest
1
2. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
このセッションについて
▸ OAuth 2.0の概要およびSpring Security 5.1の
関連機能について、基礎から分かりやすく解説
します
▸ 【中級者向け】Spring Securityの基礎知識はあ
ることが前提です
▸ でもSpring Security成分は最後の30%くらい…💦
2
ハッシュタグ
3. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⾃⼰紹介
▸ 多⽥真敏(@suke_masa)
▸ 研修トレーナー@カサレアル
▸ Spring / Java EE / Microservices
/ Cloud Foundry
▸ Pivotal認定講師
▸ ⽇本Springユーザ会スタッフ
▸ ⽇本GlassFishユーザー会運営メンバー
3
4. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
株式会社カサレアル
▸ 他社には無い⾊々なプログラミング⾔語の研修
を提供しています!
4
5. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
世界⼀ハイレベルなSpring研修
▸ Pivotal認定 Core Spring (4⽇間)
▸ DI、AOP、Test、JDBC、Tx、Data、Boot、Web、
REST、Security、OAuth 2.0、Actuator
▸ ロジカルな講義+演習で徹底理解
▸ アーキテクトやリーダー向け
5
https://www.casareal.co.jp/ls/service/openseminar/pivotal/p016
6. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
オリジナルSpring研修
▸ はじめてのSpring MVCによる
Webアプリケーション開発 (2⽇間)
▸ エントリー向けSpringの基礎
▸Spring Security⼊⾨ (1⽇間)
▸ 認証/認可、アーキテクチャー、OAuth 2.0
▸Spring Batch⼊⾨ (1⽇間)
▸ バッチ処理
6
https://www.casareal.co.jp/ls/service/openseminar/java
7. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
コンテナはじめました
▸ Docker⼊⾨ (1⽇間)
▸ Kubernetes⼊⾨ (1⽇間)
7
https://www.casareal.co.jp/ls/service/openseminar/cloudnative
8. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
11/29 SpringOneハイライト!
▸ 9⽉に⽶国で⾏われたPivotalのカンファレンス
SpringOne Platformの内容をハイライトで
ご紹介!
▸ 詳細はこちら
8
9. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⽬次
① OAuth 2.0の基本⽤語
② アクセストークンの取得
③ アクセストークンを利⽤した
リソースアクセス
④ 認可サーバーの実装
⑤ クライアントの実装
⑥ リソースサーバーの実装
9
10. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⽬次
① OAuth 2.0の基本⽤語
② アクセストークンの取得
③ アクセストークンを利⽤した
リソースアクセス
④ 認可サーバーの実装
⑤ クライアントの実装
⑥ リソースサーバーの実装
10
11. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
OAuth 2.0とは
▸ 認可の流れを規定したプロトコル
▸ RFC 6749 (⽇本語版もある)
▸ OAuth 1.0とは別物
▸ Struts 1とStruts 2くらい違う
▸ 認証プロトコルOpenID Connect
のベースになっている
11
12. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アクセストークンとは
▸ サーバーのデータにアクセスするための許可証
12
アクセス
トークン
こんにちは!
楽しみだなー
①リクエスト
②レスポンス
クライアント サーバー
13. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
スコープとは
13
スコープ=
そのアクセストークンが
やれることの範囲
14. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
ID+パスワードじゃダメなの?🤔
▸ パスワードを持っている⼈は全権限を持つ
▸ 盗んだ⼈は何でもやりたい放題😇
▸ アクセストークンなら
▸ 盗まれても、そのトークンを無効化すればいいだけ
▸ スコープにより、できることが制限されている
14
15. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
OAuth 2.0の登場⼈物
① リソースオーナー (Resource Owner)
▸ 情報の持ち主。ほぼ⼈間。
② リソースサーバー (Resource Server)
▸ 情報を保持するサーバー。
③ クライアント (Client)
▸ リソースサーバーからもらった情報を扱うアプリケーション。
④ 認可サーバー (Authorization Server)
▸ ユーザー情報を保持するサーバー。
15
クラス名などで頻出!
正確に理解しましょう
16. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Twitterの例で登場⼈物まとめ
16
twitter.com
こんにちは!
楽しみだなー
リソース
オーナー
クライアント
リソースサーバー
認可サーバー
認可
アクセス
トークン
付与
アクセス
トークン
つぶやき
※本当はTwitterはOAuth 1.0を使っています
17. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
今回のサンプルアプリ
17
▸ TODO管理アプリ
▸ 認可サーバー
▸ リソースサーバー
▸ クライアント
請求書作成
資料郵送
JSON
HTML
アクセス
トークン
検証
18. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
18
DEMO
ソースコード -> https://github.com/MasatoshiTada/oauth2-with-spring-security-51
19. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⽬次
① OAuth 2.0の基本⽤語
② アクセストークンの取得
③ アクセストークンを利⽤した
リソースアクセス
④ 認可サーバーの実装
⑤ クライアントの実装
⑥ リソースサーバーの実装
19
20. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
グラントタイプ(アクセストークンの取得⽅法)
① 認可コード
▸ 主にサーバーサイドWebアプリケーション
② インプリシット
▸ 主にクライアントサイドWebアプリケーション
③ リソースオーナーパスワードクレデンシャル
▸ 主に公式のスマホアプリなど
④ クライアントクレデンシャル
▸ クライアント⾃⾝の情報取得
20
今⽇はコレ
21. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
認可コードとは
▸ アクセストークンの引換券
21
認可サーバークライアント
1. 認可コード発⾏
2. 認可コード
3. アクセストークン
※このページの図はイメージです。正確な図は後ほど。
22. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
なぜ認可コードが必要?
▸ アクセストークンがWebブラウザに渡らないよ
うにするため!
▸ 認可コードとリダイレクトを組み合わせて実現
22
23. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アクセストークン取得の流れ
23
認可サーバー
クライアント
リソース
オーナー
Web
ブラウザ※
※Webブラウザは、仕様書では「ユーザーエージェント」と記載されています
①初回アクセス
⑤認可コード発⾏+リダイレクト
⑥認可コード
⑦アクセストークン
②認可エンドポイントにリダイレクト
認可
エンドポイント
③認可画⾯
④認可
24. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
なぜ認可コードが必要?
24
認可サーバー
クライアント
リソース
オーナー
Web
ブラウザ
①初回アクセス
⑤認可コード発⾏+リダイレクト
⑥認可コード
⑦アクセストークン
②認可エンドポイントにリダイレクト
③認可画⾯
④認可
アクセストークンが
Webブラウザに
渡らない!
25. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
認可コード発⾏+リダイレクト
25
認可サーバー
クライアント
⑤認可コード発⾏+リダイレクト
リダイレクト
エンドポイント
302 Found
Location: https://クライアント/リダ
イレクトエンドポイント?code=認可コード
GET https://クライアント/リダイレクト
エンドポイント?code=認可コード
26. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
認可コードでアクセストークンをリクエスト
26
認可サーバー
クライアント
⑥認可コード トークン
エンドポイント
POST https://認可サーバー/トークンエ
ンドポイント
grant_type=authorization_code&cod
e=認可コード&redirect_uri=リダイレク
トエンドポイント
27. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アクセストークンをレスポンス
27
認可サーバー
クライアント
⑦アクセストークン トークン
エンドポイント
200 OK
{
"access_token":"アクセストークン",
"expires_in":3600,
"refresh_token":"リフレッシュトークン"
}
28. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
OAuth 2.0仕様で未定義の部分
28
認可サーバー
クライアント
リソース
オーナー
Web
ブラウザ
①初回アクセス
⑤認可コード発⾏+リダイレクト
⑥認可コード
⑦アクセストークン
②認可エンドポイントにリダイレクト
③認可画⾯
④認可
どう認可するかは決まっていない
→開発者が作り込む
or ライブラリ依存
29. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
認証が必要な箇所①
29
認可サーバー
クライアント
リソース
オーナー
Web
ブラウザ
①初回アクセス
⑤認可コード発⾏+リダイレクト
⑥認可コード
⑦アクセストークン
②認可エンドポイントにリダイレクト
③認可画⾯
④認可
認可したのは本当にリソースオーナー?
→リソースオーナーのID・パスワードで認証
30. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
認証が必要な箇所②
30
認可サーバー
クライアント
リソース
オーナー
Web
ブラウザ
①初回アクセス
⑤認可コード発⾏+リダイレクト
⑥認可コード
⑦アクセストークン
②認可エンドポイントにリダイレクト
③認可画⾯
④認可
認可コードを送ってきたのは本当にクライアント?
→client_id・client_secretでBASIC認証
※client_idとclient_secretは、認可サーバーに事前に発⾏してもらう
31. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⽬次
① OAuth 2.0の基本⽤語
② アクセストークンの取得
③ アクセストークンを利⽤した
リソースアクセス
④ 認可サーバーの実装
⑤ クライアントの実装
⑥ リソースサーバーの実装
31
32. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アクセストークンを利⽤したリソースアクセス
32
認可サーバー
クライアント
リソース
オーナー
Web
ブラウザ
請求書作成
資料郵送
リソース
サーバー
①リクエスト
③アクセス
トークン
検証
④ユーザー情報やスコープ
⑥レスポンス⑦レスポンス
⑤スコープを
チェック
②リソースにアクセス
with アクセストークン
33. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アクセストークンを利⽤したリソースアクセス
33
認可サーバー
クライアント
リソース
オーナー
Web
ブラウザ
請求書作成
資料郵送
リソース
サーバー
①リクエスト
③アクセス
トークン
検証
④ユーザー情報やスコープ
⑥レスポンス⑦レスポンス
⑤スコープを
チェック
②リソースにアクセス
with アクセストークン
GET https://リソースサーバー/foo/bar
Authorization: Bearer アクセストークン
34. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
OAuth 2.0で未定義の部分
34
認可サーバー
クライアント
リソース
オーナー
Web
ブラウザ
請求書作成
資料郵送
リソース
サーバー
①リクエスト
③アクセス
トークン
検証
④ユーザー情報やスコープ
⑥レスポンス⑦レスポンス
⑤スコープを
チェック
②リソースにアクセス
with アクセストークン
アクセストークンを
送る部分以外は
ほとんど未定義
35. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アクセストークンやスコープの検証⽅法
A) 認可サーバーに問い合わせる(Basic認証など
が必要)
B) 共有データベースなどを利⽤する
C) アクセストークン⾃⾝に情報を含めておく
35
↑今回はコレ
36. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
JWT (JSON Web Token : ジョット)
▸ 平たく⾔うとアクセストークンの形式の⼀種
▸ アクセストークン⾃⾝にユーザー情報やスコー
プなどの情報を含めることができる
▸ 「.(ピリオド)」で3つの部分に分けられる
▸ それぞれの部分は、JSONをBase64URLでエンコード
したもの
36
38. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
ペイロードをデコードすると
38※Powered by jwt.io
スコープと
ユーザー名
39. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
署名を利⽤したJWTの検証
▸ リソースサーバーは、
JWTの署名で検証する
▸ 署名は、認可サーバーの秘
密鍵で暗号化されている
→認可サーバーの公開鍵で
復号化する
39
※Powered by jwt.io
40. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
JWK (JSON Web Key)
▸ 認可サーバーの公開鍵
の素となる情報が含ま
れたJSON
▸ 認可サーバーからJWK
Set形式(JWKの配列を含んだ
JSON)で取得する
40
JWK Set
JWK
※具体的な検証⽅法は下記ブログが参考になります
OpenID Connect の署名検証
41. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
JWTの弱点と対策
▸ 弱点:アクセストークンの剥奪が不可能👎
▸ リソースサーバーが認可サーバーに問い合わせしない
ため、認可サーバー側での制御が不可能
▸ 対策:アクセストークンの有効期限を短くする👌
▸ だいたい数分間くらい
▸ 期限が切れたらリフレッシュトークンで再取得する
41
42. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
リフレッシュトークン
▸ アクセストークンを再取得するためのトークン
▸ アクセストークン取得時に⼀緒に受け取る
42
200 OK
{
"access_token":"アクセストークン",
"expires_in":300,
"refresh_token":"リフレッシュトークン"
}
43. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アクセストークンのリフレッシュ⽅法
43
POST https://認可サーバー/トークンエンドポイント
Authorization: Basic <client_id : client_secret>
grant_type=refresh_token&refresh_token=リフレッシュ
トークン
200 OK
{
"access_token":"新しいアクセストークン",
"expires_in":300,
"refresh_token":"リフレッシュトークン"
}
※リフレッシュトークンも新しくするかはOAuth 2.0仕様には定められていない
(Keycloakではリフレッシュトークンも新しくなる)
44. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⽬次
① OAuth 2.0の基本⽤語
② アクセストークンの取得
③ アクセストークンを利⽤した
リソースアクセス
④ 認可サーバーの実装
⑤ クライアントの実装
⑥ リソースサーバーの実装
44
45. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Spring SecurityのOAuth 2.0対応の歴史
▸ 4.x以前
▸ 姉妹ライブラリに
機能が分散していた
▸ Spring Security
OAuth2
▸ Spring Cloud
▸ Spring Social...
45
▸ 5.0以降
▸ OAuth 2.0の機能を
Spring Security
本体に新規開発
▸ Spring Security
OAuth2はメンテナンス
モードへ
(バグフィックスは継続)
46. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
個⼈的な所⾒
▸ Spring Security OAuth2は難しすぎる😇
▸ ドキュメントが少ない
▸ Javadocがほとんど書いてない
▸ 似たような名前のプロパティが多い
▸ OAuth 2.0仕様で未定義な部分の独⾃実装が多い
▸ 作るべきConfigが多い
46
47. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Spring Security 5のOAuth 2.0対応状況
47
機能 説明
クライアント 5.0で対応済み
リソースサーバー 5.1で対応済み
認可サーバー 未対応(5.2以降?)
48. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
認可サーバーを作るには?
A) Spring Security OAuth2を利⽤する
B) 認可サーバー機能を持ったサービスを利⽤する
C) Keycloakなど既成の認可サーバーを利⽤する
48
↑今回はコレ
※Spring Security OAuth2の例は下記を参照
https://github.com/Pivotal-Japan/spring-security-oauth-workshop
49. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Keycloakとは
▸ OAuth2やOpenID Connectに
対応したシングルサインオン基
盤
▸ Red Hat社がオープンソースで
開発
▸ https://www.keycloak.org
49
50. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Keycloakのインストールや設定など
▸ クライアント・ユーザー・スコープ等を設定
▸ 詳細はブログに書きました
▸ OAuth 2.0 with Spring Security 5.1の認可サーバーとして
Keycloakを使う
50
51. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
重要エンドポイント
▸ 認可エンドポイント
▸ http://サーバー名/auth/realms/レルム名/protocol/openid-connect/auth
▸ トークンエンドポイント
▸ http://サーバー名/auth/realms/レルム名/protocol/openid-connect/token
▸ ユーザー情報
▸ http://サーバー名/auth/realms/レルム名/protocol/openid-connect/userinfo
▸ JWK Set
▸ http://サーバー名/auth/realms/レルム名/protocol/openid-connect/cert
51
クライアントや
リソースサーバーから
アクセスする
52. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
トークンのレスポンス
52
200 OK
{
"access_token" : "JWT形式のアクセストークン",
"expires_in" : 有効時間(秒単位),
"refresh_expires_in" : 有効時間(秒単位),
"refresh_token" : "JWT形式のリフレッシュトークン",
"scope" : "scope1 scope2 scope3 ...",
...
}
53. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⽬次
① OAuth 2.0の基本⽤語
② アクセストークンの取得
③ アクセストークンを利⽤した
リソースアクセス
④ 認可サーバーの実装
⑤ クライアントの実装
⑥ リソースサーバーの実装
53
54. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
依存性
54
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- OAuth2クライアント機能 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-client</artifactId>
</dependency>
<!-- JWT関連機能 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
55. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
application.yml
55
spring.security.oauth2.client.registration.todo:
provider: 任意の名前(.registrationの後にも指定する)
client-id: クライアントID
client-secret: クライアントシークレット
client-name: 任意の名前(画⾯表⽰で使われる)
client-authentication-method: クライアント認証⽅法
authorization-grant-type: グラントタイプ
redirect-uri: リダイレクトエンドポイントのURL
scope: このアプリのスコープをカンマ区切りで指定
※スペースの都合上でYAML形式で書いていますが、個⼈的にはproperties派です
56. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
application.yml(続き)
56
spring.security.oauth2.client.provider.todo:
authorization-uri: 認可エンドポイントのURL
token-uri: トークンエンドポイントのURL
user-info-uri: ユーザー情報のJSONが返ってくるURL
user-name-attribute: JSONの中のユーザー名を表す属性名
user-info-authentication-method: ユーザー情報取得時の認証⽅式
jwk-set-uri: JWK Setが返ってくるURL
issuer-uri: 認可サーバーのIssuer Identifier
※Keycloakの場合、issuer-uriを指定すれば他のプロパティは指定不要(user-name-attributeは任意)
57. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Java Config
57
@EnableWebSecurity
public class SecurityConfig
extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http)
throws Exception {
...
http.oauth2Login()
.loginPage("/login")
.permitAll();
...
}
}
OAuth2Loginを有効化
58. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
ログイン画⾯
58
<html ...>
<head>...</head>
<body>
<h1>OAuth2ログインページ</h1>
<a th:href="@{/oauth2/authorization/todo}">
Keycloakでログイン
</a>
</body>
</html>
/oauth2/authorization/provider名
59. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アーキテクチャー概要
59
メモリ
OAuth2AuthorizedClient
OAuth2
Access
Token
OAuth2
Refresh
Token
OAuth2AuthorizedClient
OAuth2
Access
Token
OAuth2
Refresh
Token
・・・
OAuth2
Authorized
Client
Service
※Spring Bootを利⽤している場合、
OAuth2AuthorizedClientServiceは
Bean定義済になっています
取得・削除・追加
61. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
リソースサーバーにアクセス
61
RestTemplate restTemplate = ...;
String token = ...;
// "Authorization: Bearer アクセストークン"というヘッダーを追加
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.AUTHORIZATION, "Bearer " + token);
HttpEntity<Object> httpEntity = new HttpEntity<>(headers);
// リソースサーバーにリクエストし、レスポンスを受け取る
ResponseEntity<String> responseEntity =
restTemplate.exchange("http://リソースサーバーのURL",
HttpMethod.GET, httpEntity, String.class);
62. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Spring WebFluxでは…
▸ WebClientだと、アクセストークンのヘッダー
への追加やリフレッシュを⾃動的にやってくれ
るらしい(未検証)
▸ https://docs.spring.io/spring-security/site/docs/
current/reference/htmlsingle/#servlet-webclient
62
63. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
ログアウト
▸ 必要に応じて認可サーバー
からもログアウトする
▸ 認可サーバーのログアウト
処理はLogoutHandlerで実
装する
63
請求書作成
資料郵送
クライアント
リソースサーバー
認可サーバー
ログアウト
ログアウト
64. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Keycloakからのログアウト
▸ ログアウトエンドポイントにPOSTでアクセス
▸ 必要なリクエストパラメーターは下記3つ
① クライアントID
② クライアントシークレット
③ リフレッシュトークン
64
66. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
LogoutHandlerの実装
66
@EnableWebSecurity
public class SecurityConfig
extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http)
throws Exception {
...
http.logout()
.addLogoutHandler(logoutHandler())
.invalidateHttpSession(true)
.permitAll();
...
}
}
作成したLogoutHandlerを追加
67. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⽬次
① OAuth 2.0の基本⽤語
② アクセストークンの取得
③ アクセストークンを利⽤した
リソースアクセス
④ 認可サーバーの実装
⑤ クライアントの実装
⑥ リソースサーバーの実装
67
68. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
依存性
68
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- OAuth2リソースサーバー機能 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-resource-server</
artifactId>
</dependency>
<!-- JWT関連機能 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
69. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
application.yml
69
spring.security.oauth2.resourceserver.jwt:
jwk-set-uri: JWK Setが返ってくるURL
issuer-uri: 認可サーバーのIssuer Identifier
※Keycloakの場合、issuer-uriを指定すればjwk-set-uriは指定不要
70. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
JWK Setの取得フロー
① 起動時にissuer_uriで指定されたURLにリク
エストを送信する
② レスポンスJSONのjwks_uri属性をJWK Set
を取得するURLとする
③ クライアントからの初回アクセス時にJWK Set
をリクエストする
70
71. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Java Config
71
@EnableWebSecurity
public class SecurityConfig
extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http)
throws Exception {
...
http.authorizeRequests()
.mvcMatchers("保護対象のURL")
.hasAuthority("SCOPE_スコープ名")
...;
http.oauth2ResourceServer()
.jwt();
...
}
}
73. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
OAuth 2.0のセキュリティ考慮事項
▸ 秘匿情報が⾶び交うためHTTPS必須
▸ その他、必ずOAuth 2.0仕様書をチェックしましょ
う!
▸ 10.6 認可コードリダイレクトURIの操作
▸ 10.11 フィッシングアタック
▸ 10.12 クロスサイトリクエストフォージェリ
・・・など
73
74. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
セキュリティ関連の別の仕様書
▸ RFC 6819 - OAuth 2.0 Threat Model and
Security Considerations
▸ RFC 7009 : OAuth 2.0 Token Revocation
74
75. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
まとめ
▸ まずはOAuth 2.0そのものの理解が⼤事
▸ Spring Security 5.1はクライアント機能と
リソースサーバー機能に対応
▸ 認可サーバーはSpring Security 5.2以降
▸ 現時点ではSpring Security OAuth2、既存のサービス、
既成の認可サーバーのいずれかを使う
75
76. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
参考資料
▸ 基礎からのOAuth 2.0
▸ JWTによるJSONに対する電⼦署名と、そのユースケース
▸ Spring Security Reference
▸ Securing OAuth 2.0 Resources in Spring Security 5
▸ RFC 6749 - The OAuth 2.0 Authorization Framework
▸ RFC 7519 - JSON Web Token (JWT)
▸ Spring Boot 1/2のアプリにKeycloakのOpenID Connectを使ってシングルサイ
ンオン
▸ SpringでOAuth 2.0 OpenID Connect 1.0を使う
76
77. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
研修、受けたくなりました?
▸ Pivotal認定Core Spring (4⽇間)
① 2019年1⽉10⽇・11⽇・17⽇・18⽇
② 2019年3⽉11⽇・12⽇・27⽇・28⽇
▸ Spring Security⼊⾨ (1⽇間)
① 2019年1⽉30⽇
② 2019年3⽉1⽇
77
https://www.casareal.co.jp/ls/service/openseminar/java
78. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アンケート、お願いします!
78
アンケートへのリンク
79. (C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Enjoy OAuth 2.0 & Spring Security 5.1!!
▸ ご清聴ありがとうございました!
79