Open4

【調査メモ】Redisを用いたセッション管理

setsunachansetsunachan

そもそもRedisとは?

  • メモリ上のKey-Valueストア
  • メモリ上にデータを格納するので高速に動作
    • 再起動するとデータは失われる
setsunachansetsunachan

セッション管理としてのRedis

  • セッション:クライアントとサーバーの通信状態をWebサーバー上に保存する
    • クライアントは、セッションIDをURLやCookieでサーバーに渡す
    • サーバーは、Key-Value構造としてメモリやファイル、DBに保存する
    • デフォルトは、セッションはWebサーバのメモリ上に保存される
      • Webサーバ単独でセッション管理を行うとロードバランサを構成できなくなる
      • DBに保存するとIO分のパフォーマンスに影響が出る
setsunachansetsunachan

Redisがなぜセッション管理に向いているか?

  • 高速であるため
    • セッションは頻繁に読み書きが発生する
  • 単純なデータ構造に向いているため
    • セッションは、セッションIDとセッション情報をペアとして保存することが多い
  • データにTTL(有効期限)を設定できるため
    • セッション期限切れと同期してセッションデータを削除できる
  • クラスタリングをサポートしているため
    • 大規模アプリケーションにおけるセッション管理においても拡張性が高い
  • 文字列、ハッシュ、Set、Listなどさまざまなデータ構造をサポートしている
setsunachansetsunachan
  • クライアント側はCookieとしてセッションIDを保持しておく
  • Redis側にはセッションIDをkeyとしてユーザー情報などのvalueを保持する
  • クライアント側
    • Cookieとして sessionId: { sessionId}
  • Redis
    • {sessionId}: {userInfo}

セッションハイジャックなどへの対策

  • HTTPS化
  • Cookieの設定値(Secure属性とHTTP-Only属性)を考慮する
    • Secure: true → HTTPS通信時のみCookieを送信
    • HTTP-Only: true → ブラウザ側のJSでdocument.cookieで値を取得することができなくなる(デベロッパーツールでは閲覧可能)
  • セッション期限を短く設定する
  • セッションIDのランダムで予測困難な値にする