RailsにおけるSPAの認証方法について
June 17, 2017
Rails×SPA での認証方法は何がベストなんだろうと思って、調べたことをまとめておきます。
SPA での認証方法
SPA での認証方法はざっと調べたところ以下の 3 種類に集約できそうです。
- JWT
- トークン
- セッション × クッキー
それぞれの Pros/Cons を以下で考えてみます。
1. JWT
Json Web Token を使って認証する方法です。 JWT の改ざんできない性質を使って本人かどうかを認証します。
Pros
- JWT の payload 部分にユーザ情報などを含められるので、セッション不要 → スケーラビリティ高
- シングルサインオンとかに使える模様 →JWT を使った簡易 SSO で徐々にシステムをリニューアルしている話
- knockという Rails で JWT 認証を扱う gem がある
Cons
- 署名のための鍵の管理をしないといけない
- devise的な、認証周りの面倒をまるっと見てくれる gem がなくてめんどそう
2. トークン
トークン認証は推測されにくい適当な文字列をユーザ毎に生成して、 それを HTTP ヘッダーなどに含めて一致不一致で認証するものです。
Pros
- セッション非依存なので、アプリケーションサーバを増やすのは簡単
- devise_token_authという devise のトークン認証版 gem があってさっと使える
Cons
- DB アクセスが増える(トークンを DB に保存する場合)
- devise_token_auth のカスタマイズがめんどう
3. セッション × クッキー
セッションとクッキーを使ったプリミティブな認証方法です。
Pros
- devise とか古くからある認証のための gem が使える(試してないのであれですが)
Cons
- アプリケーションサーバに紐づくのでスケールさせづらい。セッションストレージを外に持たすのもできるがそれはそれでめんどう
- CSRF Token の付与をどうするか考えないといけない(JWT・トークン認証も実装によっては考える必要があります)
まとめ
以上、SPA on Rails の認証方法について調べたことを書いてみました。
個人的には、JWT 認証が融通が効きそうで良いかなと思いましたが、認証機能の周辺(確認メールとかパスワードリセットとか)を作るのがめんどうですかね。
その点、devise_token_auth はその辺は用意されているので、要件によってはこっちでも良いなと思います。