Upgrade to Pro — share decks privately, control downloads, hide ads and more …

freee のマイクロサービス化を支える InternalSession / internal...

freee
April 20, 2023

freee のマイクロサービス化を支える InternalSession / internal-session-for-microsevices

freee

April 20, 2023
Tweet

More Decks by freee

Other Decks in Technology

Transcript

  1. freee の “プロダクト” とは • freee が提供するプロダクトの⼤部分は Web アプリケーション •

    Web アプリケーションは HTTP リクエストに対してレスポンスを 返すことによって動作する freee のサーバー freee 会計のホーム 画面出して下さい! 確定申告のページ 出して!
  2. Web アプリではセッション管理が必要 • HTTP はステートレス ◦ ログイン状態を保持できない • 特定のクライアントからの⼀連の HTTP

    リクエストの間で情報を 共有する仕組みが必要 セッション管理なしではユーザーが認証されていることを 確認することが困難 イマドキの Web アプリではほぼ必須!
  3. CookieStore vs CacheStore CookieStore CacheStore セッション情報の 保存場所 Cookie データベース (Redis

    等のKVS) Cookie に保存する 情報 セッション情報そのもの セッションID
  4. CookieStore vs CacheStore 〜Pros & Cons〜 CookieStore CacheStore Pros 外部リクエスト不要

    Revoke が容易 Cons Revoke が難しい DBアクセスがオーバーヘッド になる CookieStoreは、Railsで推奨されているデフォルトのセッションストアであり、例外的に すべてのセッションデータをcookie⾃⾝に保存します(必要に応じてセッションIDも利⽤ 可能です)。CookieStoreには⾮常に軽量であるというメリットがあり、新規Webアプリ ケーションでセッションを利⽤するための準備も不要です。 Rails ガイド ActionController の概要 5 セッション
  5. CookieStore vs CacheStore 〜Revoke〜 • Revoke = 取り消し • CacheStore

    の場合、セッション情報はサーバーサイドに保存される ので、セッションIDが漏洩した場合はデータベースの管理者権限があ れば容易に取り消せる • ⼀⽅で、CookieStore はセッション情報をクライアントサイドに保存 するため、取り消しは難しい
  6. freee のセッション管理実装 〜概略〜 • Ruby on Rails における CacheStore の実装に近い

    • セッション情報そのものは Redis に保存して、Cookie には セッションIDを保存する • セッション管理を担当する共通の認証サーバーがいる サービスB サービスC サービスA 認証サーバー
  7. The Structure of InternalSession • “.” 区切りの⽂字列で3つのパートからなる ◦ ヘッダー ◦

    ペイロード ◦ 署名 • ペイロードはセッション情報そのもの、署名は改竄防⽌⽬的で付与 “EgVlY2RzYQ==.Cg4KDAiM4qChBhCUjszqAQ==.MEUCIQCXvGZSJGlY uBhP8wLzWMqc3Bcp5GqPqzIMru2fwwl5OgIgCZ28dxlybF9VfyWfS1 +oHNsxUOdLMeyaNutOjtztSRA=” セッション情報を含んだ文字列を HTTP ヘッダに付与する JWT (JSON Web Token) と似た構造
  8. InternalSession vs 既存のセッション管理 InternalSession 既存のセッション管理 Pros 認証サーバーへの リクエスト不要 Revoke が容易

    Cons Revoke 不可 認証サーバーへの アクセス回数多 CookieStore vs CacheStore と 同じようなトレードオフがある!
  9. CookieStore vs CacheStore 〜Pros & Cons〜 the CookieStore - which

    stores all session data in the cookie itself (the ID is still available to you if you need it). This has the advantage of being very lightweight, and it requires zero setup in a new application to use the session. https://guides.rubyonrails.org/action_controller_overview.html#session CookieStore CacheStore Pros 外部リクエスト不要 Revoke が容易 Cons Revoke が難しい DBアクセスがオーバーヘッド になる
  10. つまりどういうことか? • セッション情報を丸ごとやりとりする InternalSession や CookieStore は早くて外部への依存もないが、Revoke が難しい • セッション情報を都度問い合わせるようにすると、Revoke

    は 容易だがパフォーマンス問題を引き起こす可能性がある 外部との通信でやりとりするのはセッションIDにして、 freee 内部の通信ではセッション情報をそのままやりとりする。 パフォーマンスとセキュリティを両⽴を狙った施策が InternalSession
  11. まとめ • Webアプリケーションにおいてはセッション管理が必須 • Ruby on Rails の2つのセッション管理実装には、パフォーマンスと セキュリティのトレードオフが存在する •

    freee においては都度都度認証サーバーに問い合わせる形式を採⽤ していたが、サービス数の増加等を⾒据えるとボトルネックになる 可能性が想定された • 対抗策として、InternalSession の開発導⼊を進めている