saitoxu.io

AboutTwitterGitHub

RailsにおけるSPAの認証方法について

June 17, 2017

Rails×SPA での認証方法は何がベストなんだろうと思って、調べたことをまとめておきます。

SPA での認証方法

SPA での認証方法はざっと調べたところ以下の 3 種類に集約できそうです。

  1. JWT
  2. トークン
  3. セッション × クッキー

それぞれの Pros/Cons を以下で考えてみます。

1. JWT

Json Web Token を使って認証する方法です。 JWT の改ざんできない性質を使って本人かどうかを認証します。

Pros

Cons

  • 署名のための鍵の管理をしないといけない
  • devise的な、認証周りの面倒をまるっと見てくれる gem がなくてめんどそう

2. トークン

トークン認証は推測されにくい適当な文字列をユーザ毎に生成して、 それを HTTP ヘッダーなどに含めて一致不一致で認証するものです。

Pros

  • セッション非依存なので、アプリケーションサーバを増やすのは簡単
  • devisetokenauthという devise のトークン認証版 gem があってさっと使える

Cons

  • DB アクセスが増える(トークンを DB に保存する場合)
  • devisetokenauth のカスタマイズがめんどう

3. セッション × クッキー

セッションとクッキーを使ったプリミティブな認証方法です。

Pros

  • devise とか古くからある認証のための gem が使える(試してないのであれですが)

Cons

  • アプリケーションサーバに紐づくのでスケールさせづらい。セッションストレージを外に持たすのもできるがそれはそれでめんどう
  • CSRF Token の付与をどうするか考えないといけない(JWT・トークン認証も実装によっては考える必要があります)

まとめ

以上、SPA on Rails の認証方法について調べたことを書いてみました。

個人的には、JWT 認証が融通が効きそうで良いかなと思いましたが、認証機能の周辺(確認メールとかパスワードリセットとか)を作るのがめんどうですかね。

その点、devisetokenauth はその辺は用意されているので、要件によってはこっちでも良いなと思います。