認証の仕組みの中でも基本的な会員制WEBサイトなどが採用しているかと思います。
「Cookie」 を利用した認証システムについて考えてみました。
WEBサービスにおいては Cookie 認証は重要な仕組みかと思います。
ログイン情報を利用してログインした後、Cookie によって認証状態が維持されます。
それにより、ページを遷移してもログインしたままでいられるのです。
Cookie 認証の流れ
とあるサイトでユーザーがログインをしようとする場合、以下の流れでCookieが保持されます。
- ユーザーがブラウザでユーザーID・パスワードなどでサイトにログイン
- WEBサイト側は認証して、問題なければレスポンスとして認証情報が含まれたCookieを返却
- ブラウザがWEBサイトのレスポンスを参照してCookieを保持
Cookie はWEBサイトが発行し、それらをブラウザが保存します。
その為、ユーザーとしては上記2、3は意識しないかと思います。
Cookie 認証の一部環境におけるデメリット
ごくまれな例かもしれませんが、React Nativeというモバイルアプリを実装するためのフレームワークを使っているときに発生した問題がありました。
React Nativeでは、ブラウザの機能を実現する「WebView」とHTTPリクエストを処理する「fetch」というメソッドが存在します。
基本的にはこれらの機能ではCookieは共有されるようです。
しかしながら、React Native バージョン v0.61.5 では iOS のみでうまく機能しませんでした。
例えば、WebViewの機能でブラウザからログインするような実装にして、その後、fetchにより各種ログイン状態で必要な情報取得をする場合...
fetchにCookieがうまく共有できていないようで、未ログインとして扱われ、情報取得できませんでした。
案件によっては、サーバー側の制約により、どうしてもWebViewからログインしなければいけない場合があります。
その場合にはなんともお手上げといった状態でした...
幸いにもCookieを取り出すオープンソースライブラリが存在しました。
それにより、fetchへうまくCookieを引き継いであげることができ、その時は解決しました。
Cookie方式を避けるべきか
これは非常にまれなケースかもしれません。
しかしながら、まれなケースはどうしても解決策が見つからず、ハマってしまう要因となります。
フレームワーク側のバグなどでうまく処理されなくてもなんとか解決方法を見出さねばなりません。
必要に応じてフレームワークそのものにも手を加える方法が出てしまうかもしれません。
もしもサーバーに要件がない場合、認証を伴うアプリケーションはCookie方式は回避した方が良いかもしれません。
Token方式による認証
代替となる方式として、例えば「Token」を使用した認証方式があります。
動的に発行される Cookie とは違い、静的な情報がTokenとなります。
アカウントに対して静的に発行されたTokenを利用すれば、いつでもHTTPリクエストに含めておけるので柔軟なアプリ開発が可能です。
具体的な例ではReact Nativeのモバイルアプリ開発でもCookie認証の問題を抱えている現状は、Token方式を採用すべきと言えます。
ただし、Tokenの扱いを間違えないようにセキュアな設計を心がける必要があります。