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