質問: 環境、構成 ------ [フロントエンド] Rails4 UI、バックエンド(WebAPI)とのやり取りを担当 [バックエンド] Rails4 フロントエンドからリクエストを受け付けてJSONを返すWebAPI 質問内容 ----- 上記のような構成で認証が必要なWebアプリケーションを開発しているのですが、 ユーザ認証関連の処理でどうするのがよいのか不明な点があるので質問させて頂きます。 現状、以下のような流れでユーザ認証処理を実装しています。 1. フロントエンドでログインフォームにID、パスワードを入力してSubmit 2. SubmitされたID、パスワードをバックエンドにPOST 3. バックエンドはPOSTされてきたID、パスワードで認証処理を行い、認証に成功すればアクセストークン等の認証情報をJSONで返す 4. フロントエンドは返ってきた認証情報を保持し、認証済みでないとアクセスできないページに移動 この流れの4.が不明な点でして、バックエンドから返ってきた認証情報はフロントエンドでどのように保持すればいいのでしょうか? 今は単純に認証情報をセッションに保存してページ移動の度にバックエンドに認証情報の整合性チェックをリクエストする、といった方法で実現しています。 これでも普通に要求を満たした動作はしているので問題は無いのですが、`セッションで保持する`ということに漠然とした不安があります。 フロントエンドとバックエンドが分離していない、RailsのModel, View, Controllerを用いたシンプルなアプリケーションの場合は 認証情報はセッションに保持するのが普通だと思いますが、 今回のような構成でも認証情報の保持にセッションを使うのは普通なのでしょうか? そもそもの話 ------- フロントエンドにRailsを使わずにAngularJSやVue.jsなどのJSフレームワークを使えばこのようなことを気にする必要もないのでしょうか? 「まずフロントエンドにRailsを使っていたらバックエンドと分離する意味が無くない?」と思われるかもしれませんが、 私がフロントエンドに疎いサーバサイド寄りのレガシーなエンジニアでして、とりあえず動くものを作るためにフロントエンドもRailsで構築しました。 いずれはJSフレームワーク等で置き換えるつもりではあります。 以上、ご回答頂ければ幸いです。
回答: こんにちは。stakezakiと申します。 Railsには詳しくないのですが、以下、私だったらどうするかというスタンスで回答したいと思います。 >この流れの4.が不明な点でして、バックエンドから返ってきた認証情報はフロントエンドでどのように保持すればいいのでしょうか? セッションは、ブラウザからのログイン認証が通ってからログアウトするまでの間、フロントエンドで管理するのが一般的です。 ログイン認証をバックエンドで実行したとしても、認証後にフロントエンドのセッションにトークンを保持するのは普通だと思います。 あくまで、セッションの管理の主体はフロントエンドなのでタイムアウトもしくはログアウトが実行されればバックエンドの状態にかかわらずセッションと認証トークンは破棄されることになります。 逆に、セッションが有効な間はバックエンドにエラーなくアクセスできないとだめなので、アクセストークンの有効期限切れがセッション有効期間中に発生しないように注意する必要があります。 バックエンドでセッション管理してしまうとフロントエンドとのタイムラグが出てしまうので、バックエンドではステートレスにするのがオススメです。 バックエンドでもセッション管理する場合は、フロントエンドより長い時間をセットしなければなりません。 セッションはユーザのアクションがあればタイムアウト時間が延長されるので、それに合わせてバックエンドのセッションも延長されなければなりません。 RESTの原則としてはステートレスであることがよくいわれますが、私は普通のWebアプリケーション(SPAを含む)でもWebAPI(REST)でもセッションの考え方はそれほど違わないと考えています。(ただし、スマホは除く) 関連情報として、ちょっと古くて恐縮ですが、WebAPI認証について や、RESTに関する3つの間違いもあわせて読んでいただけると、もしかしたら参考になるかもしれません。