SpringFrameworkでOAuth2.0をサポートするにはどのプロジェクトを使うべきか?

SpringFrameworkでOAuth2.0をサポートするにはどんな依存関係が一番いいのか気になりまして、ざっと調べてみました。

結論

  • Client ... Spring Security 5.2+
  • Resource Server ... Spring Security 5.2+
  • Authorization Server ... Springでは新しく作らないほうがよく、Keycloakなどを使ったほうがいい

調べてみた内容

SpringFrameworkは複数のプロジェクトが存在していて、提供される機能が分かれています。Spring BootなどでWebアプリケーションを作成したことがあれば知っているかもしれませんが、 spring-boot-starter-webspring-boot-starter-jdbc などをMavenやGradleで依存先として定義しますが、それは異なる機能を組み合わせてアプリケーションを作成するからです。そのため、OAuth2.0をサポートするためにSpring Security OAuthというプロジェクトも存在しています。

Spring Security OAuthはOAuth1とOAuth2をサポートするために開発されてきましたが、現在このプロジェクトは非推奨の扱いになっています。

https://github.com/spring-projects/spring-security-oauth

Deprecation Notice ** The Spring Security OAuth project is deprecated. The latest OAuth 2.0 support is provided by Spring Security. See the OAuth 2.0 Migration Guide for further details.

Spring Security OAuthで提供していたOAuth2.0の機能はSpring Securityに徐々に取り込まれているみたいで、Spring Security 5.3にて同等の機能をサポートするようになる計画のようですね。

https://spring.io/blog/2019/11/14/spring-security-oauth-2-0-roadmap-update

OAuth2.0 Feature MatrixというWikiのページにそれぞれのプロジェクトの対応表がありますが、Spring Security 5.2ではSpring Security OAuth2.3の機能をほとんど包含しており、機能の移行がされているのが確認できます。特にClientに関してはSpring Securityの方が多くの機能を提供していますね(WebClientやOAuth2.0 Loginなど)。こちらの表は随時更新されていくみたいなのでこの記事を読むタイミングによっては内容が異なる場合もあるかもしれません。SpringでOAuth2.0の機能を取り入れたい場合はどのプロジェクトを選択すればいいか迷った場合に参考にするといいと思います。

https://github.com/spring-projects/spring-security/wiki/OAuth-2.0-Features-Matrix

注意点としてはSpring Securityを使ってClientとResourceサーバーを作成するのは問題ないのですが、Authorizationサーバーを作成するのはあまり良くないかもしれません。表を見れば分かる通り、Spring Security OAuthから機能あまりが取り入れられていないのがわかります。なぜかというと、Authorizationサーバーの機能はSpring Securityではなく、新しくSpring Authorization Serverというプロジェクトを立ち上げ、そちらで開発を行っているからみたいですね。なので、今後Spring SecurityでAuthorizationサーバーを作成することは推奨されないのではないでしょうか。

https://github.com/spring-projects-experimental/spring-authorization-server

ただ、こちらのSpring Authorization Serverも現在コミュニティ主導で開発を行っていてバージョンは0.0.3になっています。安定して使えるようになるのはもう少し先になるでしょう。つまり、SpringFrameworkを使ってAuthorizationサーバーを作成するには今の所非推奨のSpring Security OAuthを使う必要があるので要注意です。それよりかはKeycloakなどを使って作成したほうが今のところはいいのではないかと思います。

https://www.keycloak.org

Spring Security 5のOAuth2.0を使ったサンプルは以下にあります。

https://github.com/spring-projects/spring-security/tree/5.2.0.RELEASE/samples/boot/oauth2login

ドキュメントは以下にあります。機能の実装ごとに更新されていくようなのでSpring Securityのマイナーバージョンと合っているか確認するのが良さそうです。

https://docs.spring.io/spring-security/site/docs/current/reference/html5/#oauth2login

参考にしたもの