Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

11,034 views

Published on

JSUG Spring Fest 2018の資料です。
OAuth 2.0については始めから解説しています。
Spring Security 5.1のクライアント機能・リソースサーバー機能を紹介しています。認可サーバーはKeycloakです。

Published in: Technology
  • Be the first to comment

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

  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. 2. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 このセッションについて ▸ OAuth 2.0の概要およびSpring Security 5.1の 関連機能について、基礎から分かりやすく解説 します ▸ 【中級者向け】Spring Securityの基礎知識はあ ることが前提です ▸ でもSpring Security成分は最後の30%くらい…💦 2 ハッシュタグ
  3. 3. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⾃⼰紹介 ▸ 多⽥真敏(@suke_masa) ▸ 研修トレーナー@カサレアル ▸ Spring / Java EE / Microservices
 / Cloud Foundry ▸ Pivotal認定講師 ▸ ⽇本Springユーザ会スタッフ ▸ ⽇本GlassFishユーザー会運営メンバー 3
  4. 4. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 株式会社カサレアル ▸ 他社には無い⾊々なプログラミング⾔語の研修 を提供しています! 4
  5. 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. 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. 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. 8. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 11/29 SpringOneハイライト! ▸ 9⽉に⽶国で⾏われたPivotalのカンファレンス
 SpringOne Platformの内容をハイライトで
 ご紹介! ▸ 詳細はこちら 8
  9. 9. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した
 リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 9
  10. 10. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した
 リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 10
  11. 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. 12. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークンとは ▸ サーバーのデータにアクセスするための許可証 12 アクセス トークン こんにちは!
 楽しみだなー ①リクエスト ②レスポンス クライアント サーバー
  13. 13. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 スコープとは 13 スコープ= そのアクセストークンが やれることの範囲
  14. 14. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ID+パスワードじゃダメなの?🤔 ▸ パスワードを持っている⼈は全権限を持つ ▸ 盗んだ⼈は何でもやりたい放題😇 ▸ アクセストークンなら ▸ 盗まれても、そのトークンを無効化すればいいだけ ▸ スコープにより、できることが制限されている 14
  15. 15. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 OAuth 2.0の登場⼈物 ① リソースオーナー (Resource Owner) ▸ 情報の持ち主。ほぼ⼈間。 ② リソースサーバー (Resource Server) ▸ 情報を保持するサーバー。 ③ クライアント (Client) ▸ リソースサーバーからもらった情報を扱うアプリケーション。 ④ 認可サーバー (Authorization Server) ▸ ユーザー情報を保持するサーバー。 15 クラス名などで頻出! 正確に理解しましょう
  16. 16. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Twitterの例で登場⼈物まとめ 16 twitter.com こんにちは!
 楽しみだなー リソース
 オーナー クライアント リソースサーバー 認可サーバー 認可 アクセス
 トークン
 付与 アクセス
 トークン つぶやき ※本当はTwitterはOAuth 1.0を使っています
  17. 17. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 今回のサンプルアプリ 17 ▸ TODO管理アプリ ▸ 認可サーバー ▸ リソースサーバー ▸ クライアント 請求書作成
 資料郵送 JSON HTML アクセス
 トークン 検証
  18. 18. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 18 DEMO ソースコード -> https://github.com/MasatoshiTada/oauth2-with-spring-security-51
  19. 19. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した
 リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 19
  20. 20. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 グラントタイプ(アクセストークンの取得⽅法) ① 認可コード ▸ 主にサーバーサイドWebアプリケーション ② インプリシット ▸ 主にクライアントサイドWebアプリケーション ③ リソースオーナーパスワードクレデンシャル ▸ 主に公式のスマホアプリなど ④ クライアントクレデンシャル ▸ クライアント⾃⾝の情報取得 20 今⽇はコレ
  21. 21. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 認可コードとは ▸ アクセストークンの引換券 21 認可サーバークライアント 1. 認可コード発⾏ 2. 認可コード 3. アクセストークン ※このページの図はイメージです。正確な図は後ほど。
  22. 22. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 なぜ認可コードが必要? ▸ アクセストークンがWebブラウザに渡らないよ うにするため! ▸ 認可コードとリダイレクトを組み合わせて実現 22
  23. 23. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークン取得の流れ 23 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ※ ※Webブラウザは、仕様書では「ユーザーエージェント」と記載されています ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード ⑦アクセストークン ②認可エンドポイントにリダイレクト 認可 エンドポイント ③認可画⾯ ④認可
  24. 24. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 なぜ認可コードが必要? 24 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード ⑦アクセストークン ②認可エンドポイントにリダイレクト ③認可画⾯ ④認可 アクセストークンが Webブラウザに 渡らない!
  25. 25. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 認可コード発⾏+リダイレクト 25 認可サーバー クライアント ⑤認可コード発⾏+リダイレクト リダイレクト エンドポイント 302 Found Location: https://クライアント/リダ イレクトエンドポイント?code=認可コード GET https://クライアント/リダイレクト エンドポイント?code=認可コード
  26. 26. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 認可コードでアクセストークンをリクエスト 26 認可サーバー クライアント ⑥認可コード トークン エンドポイント POST https://認可サーバー/トークンエ ンドポイント grant_type=authorization_code&cod e=認可コード&redirect_uri=リダイレク トエンドポイント
  27. 27. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークンをレスポンス 27 認可サーバー クライアント ⑦アクセストークン トークン エンドポイント 200 OK { "access_token":"アクセストークン", "expires_in":3600, "refresh_token":"リフレッシュトークン" }
  28. 28. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 OAuth 2.0仕様で未定義の部分 28 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード ⑦アクセストークン ②認可エンドポイントにリダイレクト ③認可画⾯ ④認可 どう認可するかは決まっていない →開発者が作り込む or ライブラリ依存
  29. 29. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 認証が必要な箇所① 29 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード ⑦アクセストークン ②認可エンドポイントにリダイレクト ③認可画⾯ ④認可 認可したのは本当にリソースオーナー? →リソースオーナーのID・パスワードで認証
  30. 30. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 認証が必要な箇所② 30 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ ①初回アクセス ⑤認可コード発⾏+リダイレクト ⑥認可コード ⑦アクセストークン ②認可エンドポイントにリダイレクト ③認可画⾯ ④認可 認可コードを送ってきたのは本当にクライアント? →client_id・client_secretでBASIC認証 ※client_idとclient_secretは、認可サーバーに事前に発⾏してもらう
  31. 31. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した
 リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 31
  32. 32. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークンを利⽤したリソースアクセス 32 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ 請求書作成
 資料郵送 リソース
 サーバー ①リクエスト ③アクセス
  トークン
  検証 ④ユーザー情報やスコープ ⑥レスポンス⑦レスポンス ⑤スコープを
  チェック ②リソースにアクセス
 with アクセストークン
  33. 33. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークンを利⽤したリソースアクセス 33 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ 請求書作成
 資料郵送 リソース
 サーバー ①リクエスト ③アクセス
  トークン
  検証 ④ユーザー情報やスコープ ⑥レスポンス⑦レスポンス ⑤スコープを
  チェック ②リソースにアクセス
 with アクセストークン GET https://リソースサーバー/foo/bar Authorization: Bearer アクセストークン
  34. 34. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 OAuth 2.0で未定義の部分 34 認可サーバー クライアント リソース
 オーナー Web
 ブラウザ 請求書作成
 資料郵送 リソース
 サーバー ①リクエスト ③アクセス
  トークン
  検証 ④ユーザー情報やスコープ ⑥レスポンス⑦レスポンス ⑤スコープを
  チェック ②リソースにアクセス
 with アクセストークン アクセストークンを
 送る部分以外は
 ほとんど未定義
  35. 35. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アクセストークンやスコープの検証⽅法 A) 認可サーバーに問い合わせる(Basic認証など が必要) B) 共有データベースなどを利⽤する C) アクセストークン⾃⾝に情報を含めておく 35 ↑今回はコレ
  36. 36. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 JWT (JSON Web Token : ジョット) ▸ 平たく⾔うとアクセストークンの形式の⼀種 ▸ アクセストークン⾃⾝にユーザー情報やスコー プなどの情報を含めることができる ▸ 「.(ピリオド)」で3つの部分に分けられる ▸ それぞれの部分は、JSONをBase64URLでエンコード したもの 36
  37. 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. 38. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ペイロードをデコードすると 38※Powered by jwt.io スコープと ユーザー名
  39. 39. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 署名を利⽤したJWTの検証 ▸ リソースサーバーは、
 JWTの署名で検証する ▸ 署名は、認可サーバーの秘 密鍵で暗号化されている
 →認可サーバーの公開鍵で 復号化する 39 ※Powered by jwt.io
  40. 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. 41. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 JWTの弱点と対策 ▸ 弱点:アクセストークンの剥奪が不可能👎 ▸ リソースサーバーが認可サーバーに問い合わせしない ため、認可サーバー側での制御が不可能 ▸ 対策:アクセストークンの有効期限を短くする👌 ▸ だいたい数分間くらい ▸ 期限が切れたらリフレッシュトークンで再取得する 41
  42. 42. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 リフレッシュトークン ▸ アクセストークンを再取得するためのトークン ▸ アクセストークン取得時に⼀緒に受け取る 42 200 OK { "access_token":"アクセストークン", "expires_in":300, "refresh_token":"リフレッシュトークン" }
  43. 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. 44. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した
 リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 44
  45. 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. 46. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 個⼈的な所⾒ ▸ Spring Security OAuth2は難しすぎる😇 ▸ ドキュメントが少ない ▸ Javadocがほとんど書いてない ▸ 似たような名前のプロパティが多い ▸ OAuth 2.0仕様で未定義な部分の独⾃実装が多い ▸ 作るべきConfigが多い 46
  47. 47. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Spring Security 5のOAuth 2.0対応状況 47 機能 説明 クライアント 5.0で対応済み リソースサーバー 5.1で対応済み 認可サーバー 未対応(5.2以降?)
  48. 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. 49. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Keycloakとは ▸ OAuth2やOpenID Connectに 対応したシングルサインオン基 盤 ▸ Red Hat社がオープンソースで 開発 ▸ https://www.keycloak.org 49
  50. 50. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Keycloakのインストールや設定など ▸ クライアント・ユーザー・スコープ等を設定 ▸ 詳細はブログに書きました ▸ OAuth 2.0 with Spring Security 5.1の認可サーバーとして Keycloakを使う 50
  51. 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. 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. 53. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した
 リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 53
  54. 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. 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. 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. 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. 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. 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. 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. 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. 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. 63. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ログアウト ▸ 必要に応じて認可サーバー からもログアウトする ▸ 認可サーバーのログアウト 処理はLogoutHandlerで実 装する 63 請求書作成
 資料郵送 クライアント リソースサーバー 認可サーバー ログアウト ログアウト
  64. 64. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Keycloakからのログアウト ▸ ログアウトエンドポイントにPOSTでアクセス ▸ 必要なリクエストパラメーターは下記3つ ① クライアントID ② クライアントシークレット ③ リフレッシュトークン 64
  65. 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. 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. 67. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 ⽬次 ① OAuth 2.0の基本⽤語 ② アクセストークンの取得 ③ アクセストークンを利⽤した
 リソースアクセス ④ 認可サーバーの実装 ⑤ クライアントの実装 ⑥ リソースサーバーの実装 67
  68. 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. 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. 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. 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. 72. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 最後に 72
  73. 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. 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. 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. 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. 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. 78. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 アンケート、お願いします! 78 アンケートへのリンク
  79. 79. (C) CASAREAL, Inc. All rights reserved. #jsug #sf_h4 Enjoy OAuth 2.0 & Spring Security 5.1!! ▸ ご清聴ありがとうございました! 79

×