イベントセミナー 受付終了

[参加レポート]JJUG CCC 2020 Fall

JJUG CCC 2020 Fallのゴールドスポンサーを務めました!

カサレアルは、11/7(土)に開催された「JJUG CCC 2020 Fall」のゴールドスポンサーを務めてまいりました。

当日は、カサレアル講師の多田 真敏が、スピーカーとして以下テーマでお話させていただきました。


  ◇◆セッション情報◆◇

  テーマ:

    OAuth 2.0 with Spring Security

  資 料:

    ・セッションスライド

    ・サンプルコード


本レポートでは、セッション内容やいただいたご質問をご紹介いたします。

ぜひご一読ください!


 ⧉ JJUG CCCとは(公式HPより抜粋)

JJUG CCCは毎年2回、春と秋に開催する日本最大のJavaコミュニティイベントです。

Java関連の技術や事例に関する良質なセッションが行われ、

また異なる分野で活躍するJava技術者が一堂に会する場ともなっています。

日程詳細

  • 開催日程
    2020年11月7日
  • 時間
    10時00分~19時00分 <受付開始:9時30分>
  • 会場
    オンライン

講演者

写真:多田 真敏(ただ まさとし)
株式会社カサレアル VMware認定講師
多田 真敏(ただ まさとし)

実施報告

本セッションでは、Authorization Code Grant Flowを説明できること、Spring Securityの使用経験があることを前提に、Spring Securityが持つOAuth 2.0関連の機能と仕組みを解説いたしました。
はじめに結論として「Spring Security内部のRest Templateにはタイムアウトが設定されていないことがほとんどであり、きちんとタイムアウトを設定する」ということをお伝えしました。

OAuth 2.0 with Spring Security

◆◆OAuth 2.0のおさらい
OAuth 2.0とは、認可の流れを規定したプロトコルで、認証プロトコルOpenID Connectのベースになっています。
OAuth 2.0を使用する上で、その登場人物(リソースオーナー・リソースサーバー・クライアント・認可サーバー)を理解しておくことは非常に重要になっています。
認可サーバーからクライアントへ付与されるアクセストークンの取得方法は、認可コード・インプリシット(非推奨)・リソースオーナーパスワードクレデンシャル(非推奨)・クライアントクレデンシャルの4つがあります。

認可コードによるアクセストークンの取得の流れや、アクセストークンを利用したリソースアクセスの流れについても、図解いたしました。
登場人物が多く、また工程も複数ありますが、流れを正確に理解していただけたのではないでしょうか。

◆◆クライアントの基本機能と構造
Spring Securityのクライアント機能の使用は、spring-boot-starter-oauth2-clientというライブラリを入れることで可能になります。
application.ymlやJava Configへの設定を、コードをお見せしながら解説しました。
application.ymlについては、記述するtodoの名称が任意であることや、Keycloakの場合、issuer-uriを指定すれば他のプロパティは指定不要となることなどお伝えしました。

Spring SecurityはServlet Filterで機能が実現されています。
OAuth 2.0の機能を使用した場合は、OAuth2AuthorizationRequestRedirectFilterにより認可サーバーへのリダイレクト、OAuth2LoginAuthenticationFilterにより認証が行われます。
これらのフィルターの動きについても、詳細に解説いたしました。

フィルター内で最終的に認可サーバーにアクセスし、アクセストークンを取得する役割をしているクラス”DefaultAuthorizationCodeTokenResponseClient”は、RestTemplateでアクセスを行いますが、このRestTemplateにはデフォルトでタイムアウトが設定されていません。
タイムアウトが設定されていないと、例えば長時間レスポンスが帰ってこない場合に、スレッドがブロックされたりするため、タイムアウト設定は行うべきです。
ConnectTimeoutとReadTimeoutの設定など、RestTemplate作成時のコードや、Java Configのコードをお見せしながら、タイムアウトの設定方法を解説いたしました。


◆◆クライアントでのWebClientの利用
Webクライアントとは、Spring WebFluxに含まれるリアクティブなHTTPクライアントで、ReactorのFlux/Monoを活用していることが特徴です。
セッションでは、WebClientをSpring MVC上で使う場合の設定や、WebClientのBean定義、WebClienでのOAuth 2.0機能の使用方法についてお伝えしました。

OAuth 2.0機能の使用に必要なクラス”DefaultRefreshTokenTokenResponseClient”も、RestTemplateにタイムアウトが設定されていないため、設定が必要です。
設定方法を図や具体的なコードを用いて解説しましたので、ぜひスライドをご参照ください。

◆◆リソースサーバーの基本機能と構造
リソースサーバーの機能の使用は、ライブラリ”spring-boot-starter-oauth2-resource-server”を含めることで可能になります。
application.ymlやJava Configへの設定、をご説明しました。
Spring Security Filter Chain内で認証を行うBearerTokenAuthenticationFilter内での処理についても図解しました。

◆◆Token IntrospectionとToken Propagation
まずToken Introspectionの機能についてご説明しました。
JWT形式アクセストークンの問題点として、JWTに含まれていない情報を取得できないことや、JWTに含む情報量によってトークン自体が大きくなること、認可サーバー側でアクセストークンを無効化できないことが挙げられます。
Token Introspection機能により、アクセストークン自体に含まれていない情報を取得したり、アクセストークンの有効性をチェックしたりできます。

次にToken Propagationのご紹介をしました。
マイクロサービスにおけるAPI Gateway(中間マイクロサービス)のように、自分が受け取ったアクセストークンを下流のマイクロサービスに渡す機能をToken Propagationと呼びます。
リクエスト送信前にAuthenticationオブジェクトからアクセストークンを取得し、Authorizationヘッダーにアクセストークンを追加する仕組みになっています。
Token IntrospectionとToken Propagation、それぞれの設定方法やタイムアウトについてもコードを用いて解説いたしました。

◆◆まとめ
OAuth 2.0機能では、様々な箇所でRestTemplateが使用されていますが、ほとんどにおいてタイムアウト設定がされていません。
先述しましたが、OAuth 2.0を利用するにはきちんとタイムアウトを設定することが大切です。

OAuth 2.0をもっと学びたい方へ

今回ご紹介していない、OAuth 2.0の基礎やSpring Securityのアーキテクチャについて、多田が過去のイベントでご説明しています。
OAuth 2.0の基礎を知りたい方はこちら、Spring Securityのアーキテクチャを知りたい方はこちらの発表資料をご参照ください。

またカサレルでは、Springに関連した研修を様々ご用意しております。
体系的に学びたいという方は、ぜひカサレルの研修受講もご検討ください!
<オリジナルコース>
基礎からのSpring BootによるWebアプリケーション開発
基礎からのSpring Security
基礎からのSpring Batch
<VMware認定コース>
VMware Tanzu認定 Spring: Core Training
VMware Tanzu認定 Spring Cloud: Developer

ご質問もいただきました

セッション終了後、ご質問をいただきましたのでご紹介します。


Q1. 「ServletOAuth2AuthorizedClientExchangeFilterFunctionのタイムアウト設定に関して簡単な方法があるべき」というIssueをあげたとのこと、クローズされた理由は?
A1. ServletOAuth2AuthorizedClientExchangeFilterFunctionには新旧2つのコンストラクタがある。
新しく追加されたコンストラクタは、ほぼデフォルトの設定が適切に済んでいる位置づけにあり、古くからあるコンストラクタでは、細かくカスタマイズすることが可能である。
方法としては既に提供されているため、変更の必要がないという理由だった。
またRestTemplateにはタイムアウト以外にも設定が必要な項目が複数ある中で、タイムアウトのみメソッドが提供されているのは不自然。
Q2. Token PropagationをWebClient で使う場合に、Spring WebFluxスタックでやる場合には別の設定が必要ということか?
A2. ServletBearerExchangeFilterFunctionはあくまでSpring MVCで使用するもの。
Spring WebFlux上で使用する場合は、”ServerBearerExchangeFilterFunction”というクラスがあるため、そちらを使用すると良い。
Q3. 今回紹介された機能はSpring WebFluxでも使用できるか?
A3. 使用可能。
Spring Securityは基本的にMVC版とWebFlux版があり、ほぼ同機能のため、クラス名は若干変わるが両方で同じ機能が使える。
Q4. Spring Authorization Serverの存在は知っているが、使用したことはない。
多田の所感としてメインストリームになりそうかや、触ってみた感覚を知りたい。
A4. 多田自身触っていないためGitHubでの開発状況を見たのみの感想だが、メインストリームになるのではないかという印象。
GitHubのREADME等にも、「Spring Security OAuth 2.0というライブラリ内にあった認可サーバーから置き換える目的でSpring Authorization Serverを作成している」と明確に書かれているので、今後開発が続いていくのではないか。