(node.js, express) APIでログインするときにセッションが消えてうまくログインできないことがあった

node.js + expressで開発をしたときに、APIでログインするときにセッションが消えてうまくログインできないことがあった。

まず、以下のようなことをやってみた。

  • req.jsonなどで返す前に明示的にsession.save(() => ...)でセッションを保存
  • クライアントでのfetchのオプションにcredentials: 'include'を指定
  • サーバで返すときにres.header('Access-Control-Allow-Credentials','true');とヘッダーを指定

これは関係なかったようで、解決せず、結局以下のことが原因だった。

  • ログインのAPIをGETで叩いていた。(別のAPIを転用したため)
  • 別のGET APIで短期間で2回アクセスしたら304 not modifiedが返っていたため、ログインの結果が反映されていなかった。毎回Last-Modifiedヘッダーを指定することで解決。
  • APIを同時に複数アクセスしていたため、セッションクッキーの更新が競合していた(言われてみれば当然だが...)。最初にログインAPIだけ投げるようにした。
    • それでも解決しないと思ったら、favicon取得のアクセスが同時に行われていたのが原因のようだった。(今までfaviconを置いていなかった)serve-faviconを使ってちゃんとfaviconを指定したら解決した。

ChromeのDeveloper Toolsのnetworkで、リクエストのタイミングとか載ってきているcookieとかを見るとこういうことをデバッグできることを知った。