Introduction

Web Appは、認証した後にセッションを提供する

What is Session Management?

webappは各リクエストで、ユーザー名とパスワードを使用しない
しかし、HTTPプロトコルは本質的にはステートレス
HTTPプロトコルがリクエストごとに以前のリクエストの情報(状態)を保持しない
したがって、セッション管理はwebappの使用中にユーザーを追跡する目的で使われる

セッション管理ライフサイクル

この流れで行われる

  1. セッションの作成
    • ユーザー名やパスワードなどの資格情報を入力した後にのみ発生すると思いこんでる
    • 実際は、アプリケーションにアクセスしたときに初期セッションがすでにある
      • 一部のアプリケーションが認証前でもユーザーのアクションを追跡する必要があるため
  2. セッショントラッキング
    • セッション値を受け取ると、新しいリクエストごとに送信される
    • これによって、HTTPがステートレスであってもユーザーのアクションを追跡できる
    • リクエストが行われるたびに、Web アプリケーションはリクエストからセッション値を回復し、サーバー側でルックアップを実行して、セッションの所有者と権限を把握する
    • セッション追跡プロセスに問題がある場合、攻撃者がセッションをハイジャックしたり、セッションを偽装したりする可能性がある
  3. セッションの有効期限
    • HTTPプロトコルはステートレスなので、Web アプリケーションのユーザーが突然 Web アプリケーションの使用を停止することがある
    • しかし、HTTPプロトコルはステートレスなので、Web アプリケーションには終了したことを発生したことを知る方法がない
    • そのため、セッション値自体には有効期間が設定されている必要がある
    • 有効期間が切れ、古いセッション値を Web アプリケーションに送信すると、セッションが期限切れになっているため、拒否される
    • 再度認証するためにログイン ページにリダイレクトされ、セッション管理ライフサイクルが最初から行われる
  4. セッションの終了
    • ユーザーが強制的にログアウト操作を実行することがある
    • Web アプリケーションはユーザーのセッションを終了する必要がある
    • セッションの有効期限切れに似ていますが、セッションの有効期間がまだ有効であっても、セッション自体を終了する必要があるという点で独特
    • 終了プロセスに問題があると、脅威アクターがアカウントへの永続的なアクセスを取得できる可能性がある

Authentication vs Authorisation(認証と認可)

以下のそれぞれの頭文字をとって、IAAA(AAAプロトコル)
信頼のある認証システムに必要
rfc3539で定められてる

Identification(識別)

Authentication(認証)

Authorisation(認可)

Accountability(計上)

セッション管理とAAAプロトコル(IAAA)の関係性

Cookies vs Tokens

セッションは、CookieとTokenの二つがある
それぞれに利点と欠点がある

そういえば、Cookieは廃止なんじゃないのかと思ったけど、

トークンを利用したセッション管理(Token-Based Session Management)

  1. 認証後、サーバーはトークンを発行し、リクエストボディに含めてクライアントに送信する。
  2. クライアント(JavaScript)がトークンを LocalStorage などに保存する。
  3. 新しいリクエストを送るとき、JavaScriptが LocalStorage からトークンを取り出し、ヘッダーに付与する。
  4. サーバーは送られたトークンを検証し、リクエストを処理する。

まとめ

比較項目 クッキー方式(Cookie-Based) トークン方式(Token-Based)
認証情報の送信方法 ブラウザが 自動でクッキーを送信 クライアントが JavaScriptで手動で送信
セキュリティ SecureHttpOnlySameSite 属性で保護可能 セキュリティ機能なし(適切な管理が必要)
CSRF(クロスサイトリクエストフォージェリ) 脆弱(ブラウザが自動で送るため攻撃されやすい) 強いLocalStorage は他のサイトからアクセス不可)
CORS(クロスオリジンリクエスト) 制限ありSameSiteCORS 設定が必要) 柔軟(どのドメインからでも送信可能)
実装のしやすさ 簡単(クライアント側の追加処理なし) 複雑(トークン管理や手動での送信が必要)
サーバーの状態管理 セッション管理が必要(DBやメモリにセッションを保持) ステートレス(Stateless)(サーバー側で状態を保持しない)
分散アプリ・SPAとの相性 不向き(クッキーは特定ドメインに依存) 適している(APIベースの認証に最適)
認証情報の保存場所 クッキー(ブラウザ管理) LocalStorage / SessionStorage / メモリ

使い分け

トークン方式はAPIに最適、クッキー方式は従来型アプリに適している!

Securing the Session Lifecycle

Exploiting Insecure Session Management