SlideShare a Scribd company logo
1 of 79
Download to read offline
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Pivotal認定講師が解説!
基礎からのOAuth 2.0と
Spring Security 5.1による実装
(株)カサレアル 多⽥真敏
2018年10⽉31⽇
JSUG Spring Fest
1
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
このセッションについて
▸ OAuth 2.0の概要およびSpring Security 5.1の
関連機能について、基礎から分かりやすく解説
します
▸ 【中級者向け】Spring Securityの基礎知識はあ
ることが前提です
▸ でもSpring Security成分は最後の30%くらい…💦
2
ハッシュタグ
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⾃⼰紹介
▸ 多⽥真敏(@suke_masa)
▸ 研修トレーナー@カサレアル
▸ Spring / Java EE / Microservices

/ Cloud Foundry
▸ Pivotal認定講師
▸ ⽇本Springユーザ会スタッフ
▸ ⽇本GlassFishユーザー会運営メンバー
3
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
株式会社カサレアル
▸ 他社には無い⾊々なプログラミング⾔語の研修
を提供しています!
4
(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
(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
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
コンテナはじめました
▸ Docker⼊⾨ (1⽇間)
▸ Kubernetes⼊⾨ (1⽇間)
7
https://www.casareal.co.jp/ls/service/openseminar/cloudnative
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
11/29 SpringOneハイライト!
▸ 9⽉に⽶国で⾏われたPivotalのカンファレンス

SpringOne Platformの内容をハイライトで

ご紹介!
▸ 詳細はこちら
8
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⽬次
① OAuth 2.0の基本⽤語
② アクセストークンの取得
③ アクセストークンを利⽤した

リソースアクセス
④ 認可サーバーの実装
⑤ クライアントの実装
⑥ リソースサーバーの実装
9
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⽬次
① OAuth 2.0の基本⽤語
② アクセストークンの取得
③ アクセストークンを利⽤した

リソースアクセス
④ 認可サーバーの実装
⑤ クライアントの実装
⑥ リソースサーバーの実装
10
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
OAuth 2.0とは
▸ 認可の流れを規定したプロトコル
▸ RFC 6749 (⽇本語版もある)
▸ OAuth 1.0とは別物
▸ Struts 1とStruts 2くらい違う
▸ 認証プロトコルOpenID Connect

のベースになっている
11
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アクセストークンとは
▸ サーバーのデータにアクセスするための許可証
12
アクセス
トークン
こんにちは!

楽しみだなー
①リクエスト
②レスポンス
クライアント サーバー
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
スコープとは
13
スコープ=
そのアクセストークンが
やれることの範囲
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
ID+パスワードじゃダメなの?🤔
▸ パスワードを持っている⼈は全権限を持つ
▸ 盗んだ⼈は何でもやりたい放題😇
▸ アクセストークンなら
▸ 盗まれても、そのトークンを無効化すればいいだけ
▸ スコープにより、できることが制限されている
14
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
OAuth 2.0の登場⼈物
① リソースオーナー (Resource Owner)
▸ 情報の持ち主。ほぼ⼈間。
② リソースサーバー (Resource Server)
▸ 情報を保持するサーバー。
③ クライアント (Client)
▸ リソースサーバーからもらった情報を扱うアプリケーション。
④ 認可サーバー (Authorization Server)
▸ ユーザー情報を保持するサーバー。
15
クラス名などで頻出!
正確に理解しましょう
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Twitterの例で登場⼈物まとめ
16
twitter.com
こんにちは!

楽しみだなー
リソース

オーナー
クライアント
リソースサーバー
認可サーバー
認可
アクセス

トークン

付与
アクセス

トークン
つぶやき
※本当はTwitterはOAuth 1.0を使っています
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
今回のサンプルアプリ
17
▸ TODO管理アプリ
▸ 認可サーバー
▸ リソースサーバー
▸ クライアント
請求書作成

資料郵送
JSON
HTML
アクセス

トークン
検証
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
18
DEMO
ソースコード -> https://github.com/MasatoshiTada/oauth2-with-spring-security-51
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⽬次
① OAuth 2.0の基本⽤語
② アクセストークンの取得
③ アクセストークンを利⽤した

リソースアクセス
④ 認可サーバーの実装
⑤ クライアントの実装
⑥ リソースサーバーの実装
19
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
グラントタイプ(アクセストークンの取得⽅法)
① 認可コード
▸ 主にサーバーサイドWebアプリケーション
② インプリシット
▸ 主にクライアントサイドWebアプリケーション
③ リソースオーナーパスワードクレデンシャル
▸ 主に公式のスマホアプリなど
④ クライアントクレデンシャル
▸ クライアント⾃⾝の情報取得
20
今⽇はコレ
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
認可コードとは
▸ アクセストークンの引換券
21
認可サーバークライアント
1. 認可コード発⾏
2. 認可コード
3. アクセストークン
※このページの図はイメージです。正確な図は後ほど。
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
なぜ認可コードが必要?
▸ アクセストークンがWebブラウザに渡らないよ
うにするため!
▸ 認可コードとリダイレクトを組み合わせて実現
22
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アクセストークン取得の流れ
23
認可サーバー
クライアント
リソース

オーナー
Web

ブラウザ※
※Webブラウザは、仕様書では「ユーザーエージェント」と記載されています
①初回アクセス
⑤認可コード発⾏+リダイレクト
⑥認可コード
⑦アクセストークン
②認可エンドポイントにリダイレクト
認可
エンドポイント
③認可画⾯
④認可
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
なぜ認可コードが必要?
24
認可サーバー
クライアント
リソース

オーナー
Web

ブラウザ
①初回アクセス
⑤認可コード発⾏+リダイレクト
⑥認可コード
⑦アクセストークン
②認可エンドポイントにリダイレクト
③認可画⾯
④認可
アクセストークンが
Webブラウザに
渡らない!
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
認可コード発⾏+リダイレクト
25
認可サーバー
クライアント
⑤認可コード発⾏+リダイレクト
リダイレクト
エンドポイント
302 Found
Location: https://クライアント/リダ
イレクトエンドポイント?code=認可コード
GET https://クライアント/リダイレクト
エンドポイント?code=認可コード
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
認可コードでアクセストークンをリクエスト
26
認可サーバー
クライアント
⑥認可コード トークン
エンドポイント
POST https://認可サーバー/トークンエ
ンドポイント
grant_type=authorization_code&cod
e=認可コード&redirect_uri=リダイレク
トエンドポイント
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アクセストークンをレスポンス
27
認可サーバー
クライアント
⑦アクセストークン トークン
エンドポイント
200 OK
{
"access_token":"アクセストークン",
"expires_in":3600,
"refresh_token":"リフレッシュトークン"
}
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
OAuth 2.0仕様で未定義の部分
28
認可サーバー
クライアント
リソース

オーナー
Web

ブラウザ
①初回アクセス
⑤認可コード発⾏+リダイレクト
⑥認可コード
⑦アクセストークン
②認可エンドポイントにリダイレクト
③認可画⾯
④認可
どう認可するかは決まっていない
→開発者が作り込む
or ライブラリ依存
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
認証が必要な箇所①
29
認可サーバー
クライアント
リソース

オーナー
Web

ブラウザ
①初回アクセス
⑤認可コード発⾏+リダイレクト
⑥認可コード
⑦アクセストークン
②認可エンドポイントにリダイレクト
③認可画⾯
④認可
認可したのは本当にリソースオーナー?
→リソースオーナーのID・パスワードで認証
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
認証が必要な箇所②
30
認可サーバー
クライアント
リソース

オーナー
Web

ブラウザ
①初回アクセス
⑤認可コード発⾏+リダイレクト
⑥認可コード
⑦アクセストークン
②認可エンドポイントにリダイレクト
③認可画⾯
④認可
認可コードを送ってきたのは本当にクライアント?
→client_id・client_secretでBASIC認証
※client_idとclient_secretは、認可サーバーに事前に発⾏してもらう
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⽬次
① OAuth 2.0の基本⽤語
② アクセストークンの取得
③ アクセストークンを利⽤した

リソースアクセス
④ 認可サーバーの実装
⑤ クライアントの実装
⑥ リソースサーバーの実装
31
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アクセストークンを利⽤したリソースアクセス
32
認可サーバー
クライアント
リソース

オーナー
Web

ブラウザ
請求書作成

資料郵送
リソース

サーバー
①リクエスト
③アクセス

 トークン

 検証
④ユーザー情報やスコープ
⑥レスポンス⑦レスポンス
⑤スコープを

 チェック
②リソースにアクセス

with アクセストークン
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アクセストークンを利⽤したリソースアクセス
33
認可サーバー
クライアント
リソース

オーナー
Web

ブラウザ
請求書作成

資料郵送
リソース

サーバー
①リクエスト
③アクセス

 トークン

 検証
④ユーザー情報やスコープ
⑥レスポンス⑦レスポンス
⑤スコープを

 チェック
②リソースにアクセス

with アクセストークン
GET https://リソースサーバー/foo/bar
Authorization: Bearer アクセストークン
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
OAuth 2.0で未定義の部分
34
認可サーバー
クライアント
リソース

オーナー
Web

ブラウザ
請求書作成

資料郵送
リソース

サーバー
①リクエスト
③アクセス

 トークン

 検証
④ユーザー情報やスコープ
⑥レスポンス⑦レスポンス
⑤スコープを

 チェック
②リソースにアクセス

with アクセストークン
アクセストークンを

送る部分以外は

ほとんど未定義
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アクセストークンやスコープの検証⽅法
A) 認可サーバーに問い合わせる(Basic認証など
が必要)
B) 共有データベースなどを利⽤する
C) アクセストークン⾃⾝に情報を含めておく
35
↑今回はコレ
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
JWT (JSON Web Token : ジョット)
▸ 平たく⾔うとアクセストークンの形式の⼀種
▸ アクセストークン⾃⾝にユーザー情報やスコー
プなどの情報を含めることができる
▸ 「.(ピリオド)」で3つの部分に分けられる
▸ それぞれの部分は、JSONをBase64URLでエンコード
したもの
36
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
JWTの構造
37
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJzbGcyMG9uOVg2c
zZFOExmNDZfQmRuaExHQy1xZnIyMVlvWE9nQVFKRlIwIn0.eyJqdGkiOiI4YzUyN
mMzZC03OTA0LTQ2MWItOGU5ZS1jNDE5YTQ1NmFlNDMiLCJleHAiOjE1Mzg4MTM0Mj
YsIm5iZiI6MCwiaWF0IjoxNTM4ODEzMTI2LCJpc3MiOiJodHRwOi8vbG9jYWxob3N
0OjkwMDAvYXV0aC9yZWFsbXMvaGVsbG8tYXBpIiwiYXVkIjoidHJhaW5pbmc2LWZy
b250LXNlcnZpY2UiLCJzdWIiOiIxYWI5Yjg4Ny0yNDRhLTRjZTktYTBjMy1iZTc2Z
GE4NzZiMTQiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJ0cmFpbmluZzYtZnJvbnQtc2
VydmljZSIsImF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjA4MjU3OTFlLTE
3ODQtNGQxMC1hMjYyLTAzM2U4YmE3OWViMCIsImFjciI6IjEiLCJhbGxvd2VkLW9y
aWdpbnMiOlsiaHR0cDovL2xvY2FsaG9zdDo4MDgwIl0sInJlYWxtX2FjY2VzcyI6e
yJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LC
JyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWN
jb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwi
c2NvcGUiOiJoZWxsbzpyZWFkIHByb2ZpbGUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiO
iJ1c2VyIn0.fH8s3HaOFjC1CiZeWUP2O1AB2ruDPh9VRnFqSkRoM2zCTpqWgrkiQ
BKW3r9RQAD_gsZCi3G7s0tQSCmuAMoht7gLgH9rFKzdKhuKiISeDUF7v2baPva8fH
VN8zP1YF84XnVxq-zVThXLBdDgTRXWWI0_RG6x-
vJVDRv00gvDwPPvA3WxxIGcekuEjl3ChQhFHozDiEglAlN-
vlkDV2IvxVtON4GJ1UAwIj9uTpyAoIVY8oOy_0mMuevzxBSXk2HUxWr2Vrvhj3c2a
RrchCOHPsDELtX0CmEBj_bU38d1XbHL30Ar7PWGvpPeSkM3mIykR-
osPDSXJwq8gUSAda0JeQ
ヘッダー
ペイロード
電⼦署名
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
ペイロードをデコードすると
38※Powered by jwt.io
スコープと
ユーザー名
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
署名を利⽤したJWTの検証
▸ リソースサーバーは、

JWTの署名で検証する
▸ 署名は、認可サーバーの秘
密鍵で暗号化されている

→認可サーバーの公開鍵で
復号化する
39
※Powered by jwt.io
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
JWK (JSON Web Key)
▸ 認可サーバーの公開鍵
の素となる情報が含ま
れたJSON
▸ 認可サーバーからJWK
Set形式(JWKの配列を含んだ
JSON)で取得する
40
JWK Set
JWK
※具体的な検証⽅法は下記ブログが参考になります

 OpenID Connect の署名検証
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
JWTの弱点と対策
▸ 弱点:アクセストークンの剥奪が不可能👎
▸ リソースサーバーが認可サーバーに問い合わせしない
ため、認可サーバー側での制御が不可能
▸ 対策:アクセストークンの有効期限を短くする👌
▸ だいたい数分間くらい
▸ 期限が切れたらリフレッシュトークンで再取得する
41
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
リフレッシュトークン
▸ アクセストークンを再取得するためのトークン
▸ アクセストークン取得時に⼀緒に受け取る
42
200 OK
{
"access_token":"アクセストークン",
"expires_in":300,
"refresh_token":"リフレッシュトークン"
}
(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ではリフレッシュトークンも新しくなる)
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⽬次
① OAuth 2.0の基本⽤語
② アクセストークンの取得
③ アクセストークンを利⽤した

リソースアクセス
④ 認可サーバーの実装
⑤ クライアントの実装
⑥ リソースサーバーの実装
44
(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はメンテナンス
モードへ

(バグフィックスは継続)
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
個⼈的な所⾒
▸ Spring Security OAuth2は難しすぎる😇
▸ ドキュメントが少ない
▸ Javadocがほとんど書いてない
▸ 似たような名前のプロパティが多い
▸ OAuth 2.0仕様で未定義な部分の独⾃実装が多い
▸ 作るべきConfigが多い
46
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Spring Security 5のOAuth 2.0対応状況
47
機能 説明
クライアント 5.0で対応済み
リソースサーバー 5.1で対応済み
認可サーバー 未対応(5.2以降?)
(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
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Keycloakとは
▸ OAuth2やOpenID Connectに
対応したシングルサインオン基
盤
▸ Red Hat社がオープンソースで
開発
▸ https://www.keycloak.org
49
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Keycloakのインストールや設定など
▸ クライアント・ユーザー・スコープ等を設定
▸ 詳細はブログに書きました
▸ OAuth 2.0 with Spring Security 5.1の認可サーバーとして
Keycloakを使う
50
(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
クライアントや
リソースサーバーから
アクセスする
(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 ...",
...
}
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⽬次
① OAuth 2.0の基本⽤語
② アクセストークンの取得
③ アクセストークンを利⽤した

リソースアクセス
④ 認可サーバーの実装
⑤ クライアントの実装
⑥ リソースサーバーの実装
53
(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>
(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派です
(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は任意)
(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を有効化
(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名
(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定義済になっています
取得・削除・追加
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アクセストークンの取得
60
@Autowired
private OAuth2AuthorizedClientService clientService;
// OAuth2AuthenticationTokenはAuthentication実装クラス
OAuth2AuthenticationToken auth =
(OAuth2AuthenticationToken) SecurityContextHolder
.getContext().getAuthentication();
// OAuth2AuthorizedClientを取得
OAuth2AuthorizedClient client =
clientService.loadAuthorizedClient(
auth.getAuthorizedClientRegistrationId(),
auth.getName());
// アクセストークンを取得
String token = client.getAccessToken().getTokenValue();
(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);
(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
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
ログアウト
▸ 必要に応じて認可サーバー
からもログアウトする
▸ 認可サーバーのログアウト
処理はLogoutHandlerで実
装する
63
請求書作成

資料郵送
クライアント
リソースサーバー
認可サーバー
ログアウト
ログアウト
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Keycloakからのログアウト
▸ ログアウトエンドポイントにPOSTでアクセス
▸ 必要なリクエストパラメーターは下記3つ
① クライアントID
② クライアントシークレット
③ リフレッシュトークン
64
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
LogoutHandlerの実装
65
private LogoutHandler logoutHandler() {
return (request, response, authentication) -> {
MultiValueMap<String, String> params = ...;
params.add("client_id", クライアントID);
params.add("client_secret", クライアントシークレット);
params.add("refresh_token", リフレッシュトークン);
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_FORM_URLENCODED_VALUE);
RequestEntity<MultiValueMap<String, String>> requestEntity =
new RequestEntity<>(params, headers, HttpMethod.POST,
URI.create(Keycloakのログアウトエンドポイント);
ResponseEntity<String> responseEntity =
restTemplate.exchange(requestEntity, String.class);
};
}
※リフレッシュトークンなどの取得方法はソースコード参照
(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を追加
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
⽬次
① OAuth 2.0の基本⽤語
② アクセストークンの取得
③ アクセストークンを利⽤した

リソースアクセス
④ 認可サーバーの実装
⑤ クライアントの実装
⑥ リソースサーバーの実装
67
(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>
(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は指定不要
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
JWK Setの取得フロー
① 起動時にissuer_uriで指定されたURLにリク
エストを送信する
② レスポンスJSONのjwks_uri属性をJWK Set
を取得するURLとする
③ クライアントからの初回アクセス時にJWK Set
をリクエストする
70
(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();
...
}
}
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
最後に
72
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
OAuth 2.0のセキュリティ考慮事項
▸ 秘匿情報が⾶び交うためHTTPS必須
▸ その他、必ずOAuth 2.0仕様書をチェックしましょ
う!
▸ 10.6 認可コードリダイレクトURIの操作
▸ 10.11 フィッシングアタック
▸ 10.12 クロスサイトリクエストフォージェリ

・・・など
73
(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
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
まとめ
▸ まずはOAuth 2.0そのものの理解が⼤事
▸ Spring Security 5.1はクライアント機能と

リソースサーバー機能に対応
▸ 認可サーバーはSpring Security 5.2以降
▸ 現時点ではSpring Security OAuth2、既存のサービス、

既成の認可サーバーのいずれかを使う
75
(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
(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
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
アンケート、お願いします!
78
アンケートへのリンク
(C) CASAREAL, Inc. All rights reserved.
#jsug #sf_h4
Enjoy OAuth 2.0 & Spring Security 5.1!!
▸ ご清聴ありがとうございました!
79

More Related Content

What's hot

これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと土岐 孝平
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービューMasatoshi Tada
 
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線MeetupMasatoshi Tada
 
Keycloak拡張入門
Keycloak拡張入門Keycloak拡張入門
Keycloak拡張入門Hiroyuki Wada
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本kazuki kumagai
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション土岐 孝平
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -onozaty
 
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善Ito Takayuki
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説増田 亨
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Ryosuke Uchitate
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールdcubeio
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところY Watanabe
 
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall ) LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall ) Hironobu Isoda
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことAmazon Web Services Japan
 

What's hot (20)

これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
 
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
 
Keycloak拡張入門
Keycloak拡張入門Keycloak拡張入門
Keycloak拡張入門
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
KeycloakでAPI認可に入門する
KeycloakでAPI認可に入門するKeycloakでAPI認可に入門する
KeycloakでAPI認可に入門する
 
Keycloakのステップアップ認証について
Keycloakのステップアップ認証についてKeycloakのステップアップ認証について
Keycloakのステップアップ認証について
 
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall ) LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 

Similar to 基礎からのOAuth 2.0とSpring Security 5.1による実装

OAuth Security Workshop 2017 #osw17
OAuth Security Workshop 2017 #osw17OAuth Security Workshop 2017 #osw17
OAuth Security Workshop 2017 #osw17Tatsuo Kudo
 
Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUehara Junji
 
多要素認証による Amazon WorkSpaces の利用
多要素認証による Amazon WorkSpaces の利用多要素認証による Amazon WorkSpaces の利用
多要素認証による Amazon WorkSpaces の利用Amazon Web Services Japan
 
Azure Functions あれこれ
Azure Functions あれこれAzure Functions あれこれ
Azure Functions あれこれYasuaki Matsuda
 
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化Issei Hiraoka
 
Azure DevOpsとセキュリティ
Azure DevOpsとセキュリティAzure DevOpsとセキュリティ
Azure DevOpsとセキュリティKazushi Kamegawa
 
Azure AD による Web API の 保護
Azure AD による Web API の 保護 Azure AD による Web API の 保護
Azure AD による Web API の 保護 junichi anno
 
Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報Takuya Iwatsuka
 
Azure ADアプリケーションを使用した認証のあれやこれ
Azure ADアプリケーションを使用した認証のあれやこれAzure ADアプリケーションを使用した認証のあれやこれ
Azure ADアプリケーションを使用した認証のあれやこれDevTakas
 
20220409 AWS BLEA 開発にあたって検討したこと
20220409 AWS BLEA 開発にあたって検討したこと20220409 AWS BLEA 開発にあたって検討したこと
20220409 AWS BLEA 開発にあたって検討したことAmazon Web Services Japan
 
Azure Stack Hybrid DevOpsデモンストレーション
Azure Stack Hybrid DevOpsデモンストレーションAzure Stack Hybrid DevOpsデモンストレーション
Azure Stack Hybrid DevOpsデモンストレーションMasahiko Ebisuda
 
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所真吾 吉田
 
Azure Active Directory 利用開始への第一歩
Azure Active Directory 利用開始への第一歩Azure Active Directory 利用開始への第一歩
Azure Active Directory 利用開始への第一歩Yusuke Kodama
 
MicrosoftのOSSへの取り組み
MicrosoftのOSSへの取り組みMicrosoftのOSSへの取り組み
MicrosoftのOSSへの取り組みShinichiro Arai
 
Microsoft Azure のセキュリティ
Microsoft Azure のセキュリティMicrosoft Azure のセキュリティ
Microsoft Azure のセキュリティjunichi anno
 
Azure AD によるリソースの保護 how to protect and govern resources under the Azure AD
Azure AD によるリソースの保護 how to protect and govern resources under the Azure ADAzure AD によるリソースの保護 how to protect and govern resources under the Azure AD
Azure AD によるリソースの保護 how to protect and govern resources under the Azure ADjunichi anno
 
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~normalian
 
20150704 MS Azure最新 - innovation egg 第4回
20150704 MS Azure最新 - innovation egg 第4回20150704 MS Azure最新 - innovation egg 第4回
20150704 MS Azure最新 - innovation egg 第4回Keiji Kamebuchi
 
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Hitachi, Ltd. OSS Solution Center.
 

Similar to 基礎からのOAuth 2.0とSpring Security 5.1による実装 (20)

OAuth Security Workshop 2017 #osw17
OAuth Security Workshop 2017 #osw17OAuth Security Workshop 2017 #osw17
OAuth Security Workshop 2017 #osw17
 
Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST API
 
多要素認証による Amazon WorkSpaces の利用
多要素認証による Amazon WorkSpaces の利用多要素認証による Amazon WorkSpaces の利用
多要素認証による Amazon WorkSpaces の利用
 
Azure Functions あれこれ
Azure Functions あれこれAzure Functions あれこれ
Azure Functions あれこれ
 
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
 
Azure DevOpsとセキュリティ
Azure DevOpsとセキュリティAzure DevOpsとセキュリティ
Azure DevOpsとセキュリティ
 
Azure AD による Web API の 保護
Azure AD による Web API の 保護 Azure AD による Web API の 保護
Azure AD による Web API の 保護
 
Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報
 
Azure ADアプリケーションを使用した認証のあれやこれ
Azure ADアプリケーションを使用した認証のあれやこれAzure ADアプリケーションを使用した認証のあれやこれ
Azure ADアプリケーションを使用した認証のあれやこれ
 
20220409 AWS BLEA 開発にあたって検討したこと
20220409 AWS BLEA 開発にあたって検討したこと20220409 AWS BLEA 開発にあたって検討したこと
20220409 AWS BLEA 開発にあたって検討したこと
 
Azure Stack Hybrid DevOpsデモンストレーション
Azure Stack Hybrid DevOpsデモンストレーションAzure Stack Hybrid DevOpsデモンストレーション
Azure Stack Hybrid DevOpsデモンストレーション
 
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
 
Azure Active Directory 利用開始への第一歩
Azure Active Directory 利用開始への第一歩Azure Active Directory 利用開始への第一歩
Azure Active Directory 利用開始への第一歩
 
MicrosoftのOSSへの取り組み
MicrosoftのOSSへの取り組みMicrosoftのOSSへの取り組み
MicrosoftのOSSへの取り組み
 
Microsoft Azure のセキュリティ
Microsoft Azure のセキュリティMicrosoft Azure のセキュリティ
Microsoft Azure のセキュリティ
 
Azure AD によるリソースの保護 how to protect and govern resources under the Azure AD
Azure AD によるリソースの保護 how to protect and govern resources under the Azure ADAzure AD によるリソースの保護 how to protect and govern resources under the Azure AD
Azure AD によるリソースの保護 how to protect and govern resources under the Azure AD
 
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
 
20150704 MS Azure最新 - innovation egg 第4回
20150704 MS Azure最新 - innovation egg 第4回20150704 MS Azure最新 - innovation egg 第4回
20150704 MS Azure最新 - innovation egg 第4回
 
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
 
[Japan Tech summit 2017] SEC 009
[Japan Tech summit 2017] SEC 009[Japan Tech summit 2017] SEC 009
[Japan Tech summit 2017] SEC 009
 

More from Masatoshi Tada

Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccPivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccMasatoshi Tada
 
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説Masatoshi Tada
 
Java EE 8新機能解説 -Bean Validation 2.0編-
Java EE 8新機能解説 -Bean Validation 2.0編-Java EE 8新機能解説 -Bean Validation 2.0編-
Java EE 8新機能解説 -Bean Validation 2.0編-Masatoshi Tada
 
JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会Masatoshi Tada
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるMasatoshi Tada
 
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~Masatoshi Tada
 
Spring Data JPAによるデータアクセス徹底入門 #jsug
Spring Data JPAによるデータアクセス徹底入門 #jsugSpring Data JPAによるデータアクセス徹底入門 #jsug
Spring Data JPAによるデータアクセス徹底入門 #jsugMasatoshi Tada
 
Getting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with ThymeleafGetting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with ThymeleafMasatoshi Tada
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallMasatoshi Tada
 
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新Masatoshi Tada
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)Masatoshi Tada
 
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho ltNetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho ltMasatoshi Tada
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2Masatoshi Tada
 
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_cccJPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_cccMasatoshi Tada
 

More from Masatoshi Tada (15)

Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccPivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
 
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
 
Java EE 8新機能解説 -Bean Validation 2.0編-
Java EE 8新機能解説 -Bean Validation 2.0編-Java EE 8新機能解説 -Bean Validation 2.0編-
Java EE 8新機能解説 -Bean Validation 2.0編-
 
JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みる
 
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
 
Spring Data JPAによるデータアクセス徹底入門 #jsug
Spring Data JPAによるデータアクセス徹底入門 #jsugSpring Data JPAによるデータアクセス徹底入門 #jsug
Spring Data JPAによるデータアクセス徹底入門 #jsug
 
Getting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with ThymeleafGetting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with Thymeleaf
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 Fall
 
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)
 
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho ltNetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
 
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_cccJPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
 

基礎からの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
  • 37. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 JWTの構造 37 eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJzbGcyMG9uOVg2c zZFOExmNDZfQmRuaExHQy1xZnIyMVlvWE9nQVFKRlIwIn0.eyJqdGkiOiI4YzUyN mMzZC03OTA0LTQ2MWItOGU5ZS1jNDE5YTQ1NmFlNDMiLCJleHAiOjE1Mzg4MTM0Mj YsIm5iZiI6MCwiaWF0IjoxNTM4ODEzMTI2LCJpc3MiOiJodHRwOi8vbG9jYWxob3N 0OjkwMDAvYXV0aC9yZWFsbXMvaGVsbG8tYXBpIiwiYXVkIjoidHJhaW5pbmc2LWZy b250LXNlcnZpY2UiLCJzdWIiOiIxYWI5Yjg4Ny0yNDRhLTRjZTktYTBjMy1iZTc2Z GE4NzZiMTQiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJ0cmFpbmluZzYtZnJvbnQtc2 VydmljZSIsImF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjA4MjU3OTFlLTE 3ODQtNGQxMC1hMjYyLTAzM2U4YmE3OWViMCIsImFjciI6IjEiLCJhbGxvd2VkLW9y aWdpbnMiOlsiaHR0cDovL2xvY2FsaG9zdDo4MDgwIl0sInJlYWxtX2FjY2VzcyI6e yJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LC JyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWN jb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwi c2NvcGUiOiJoZWxsbzpyZWFkIHByb2ZpbGUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiO iJ1c2VyIn0.fH8s3HaOFjC1CiZeWUP2O1AB2ruDPh9VRnFqSkRoM2zCTpqWgrkiQ BKW3r9RQAD_gsZCi3G7s0tQSCmuAMoht7gLgH9rFKzdKhuKiISeDUF7v2baPva8fH VN8zP1YF84XnVxq-zVThXLBdDgTRXWWI0_RG6x- vJVDRv00gvDwPPvA3WxxIGcekuEjl3ChQhFHozDiEglAlN- vlkDV2IvxVtON4GJ1UAwIj9uTpyAoIVY8oOy_0mMuevzxBSXk2HUxWr2Vrvhj3c2a RrchCOHPsDELtX0CmEBj_bU38d1XbHL30Ar7PWGvpPeSkM3mIykR- osPDSXJwq8gUSAda0JeQ ヘッダー ペイロード 電⼦署名
  • 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定義済になっています 取得・削除・追加
  • 60. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークンの取得 60 @Autowired private OAuth2AuthorizedClientService clientService; // OAuth2AuthenticationTokenはAuthentication実装クラス OAuth2AuthenticationToken auth = (OAuth2AuthenticationToken) SecurityContextHolder .getContext().getAuthentication(); // OAuth2AuthorizedClientを取得 OAuth2AuthorizedClient client = clientService.loadAuthorizedClient( auth.getAuthorizedClientRegistrationId(), auth.getName()); // アクセストークンを取得 String token = client.getAccessToken().getTokenValue();
  • 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
  • 65. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 LogoutHandlerの実装 65 private LogoutHandler logoutHandler() { return (request, response, authentication) -> { MultiValueMap<String, String> params = ...; params.add("client_id", クライアントID); params.add("client_secret", クライアントシークレット); params.add("refresh_token", リフレッシュトークン); HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE); RequestEntity<MultiValueMap<String, String>> requestEntity = new RequestEntity<>(params, headers, HttpMethod.POST, URI.create(Keycloakのログアウトエンドポイント); ResponseEntity<String> responseEntity = restTemplate.exchange(requestEntity, String.class); }; } ※リフレッシュトークンなどの取得方法はソースコード参照
  • 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(); ... } }
  • 72. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 最後に 72
  • 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