徳丸先生のSPAセキュリティの講演を聞いたのでメモ。

メモ

  • JavaScript で複数サーバをまたがって通信する(XMLHttpRequestやFetch API)場合には CORS(Cross-Origin Resource Sharing) の理解が不可欠
  • CORS ヘッダ
    • 【必須】Access-Control-Allow-Credentials: true
    • 【必須】Access-Control-Allow-Origin: http://www.example.org
    • Access-Control-Allow-Origin: * ではレスポンスを受け取れない
  • Firebaseを用いたSPAのサーバー構成
    • Firebase Hosting: 静的ファイルのホスティング
      • https://www.example.com
      • HTML、画像、CSS、JavaScript
    • API
      • firestore.googleapis.com
      • JSON
    • 認証サーバー
      • https://identitytoolkit.googleapis.com
      • JWT等
  • ステートフルなトークンはセキュリティ要件を満たしやすい
    • 完全なログアウトのためには、トークンの削除をする
    • パスワード変更時に既存セッションを破棄する
  • ケーススタディ: ChatWork

JWTのヘッダ形式

<Header>.<payload>.<signature>のフォーマット。

GET /api/user HTTP/1.1
Host: example.com
Authorization: Bearer eyJhbxxxxxx.eyJzdWxxxx.SflKxwxxx

ペイロードの例は下記

{
  "iss": "https://securetoken.google.com/firebbs-XXXXX",  // JWTの発行者 (issuer) の識別子
  "aud": "firebbs-XXXXX",                                 // JWTの受取先
  "auth_time": 1632916659,                                // 認証日時 (エポックタイム)
  "sub": "MhdJidRysBNPdHQ1zHIIaGE363y2",                   // ユーザーの一意な識別子 (不変のもの)
  "iat": 1632966032,                                      // JWT発行日時 (エポックタイム)
  "exp": 1632969632                                       // JWTの有効期限 (エポックタイム)
}