😉

Cookieの有効期限を15分に設定したはずが900日になっていた話

2024/10/29に公開

起こったこと

私たちの開発するプロダクトでは一部のCookieについて、フロントエンドからJavaScriptで操作しています。

タイトルの通り、リリース前のサービスでこのCookieの有効期限が900日になっていました。

なぜ起こったか

実は私の所属する開発本部ではすでに運用中のサービスでもクライアントからCookieを操作していました。
新規サービスでも同じような処理が必要になったため、既存のコードを参考に以下のように記述しました。

既存のサービスのコード
export const COOKIE_CONFIG = {
  maxAge: 15 * 60, // 15minutes
  path: '/',
  secure: true,
};
開発中のサービスで書いていたコード
export const COOKIE_CINFIG = {
  expires: 15 * 60, // 15minutes(本当は900日)
  path: '/',
  secure: true,
};

もうお気づきだとは思いますが、開発中のコードで有効期限が15 * 60 = 900日となっていました。

異なるパッケージ

既存のサービスではCookieの管理にnookiesを使用しており、開発中のサービスでは更新頻度などからjs-cookieを選定しました。

nookiesではexpiresmaxAgeが指定でき、

nookiesのconfig
expires?: Date;
maxAge?: number;

js-cookieではmaxAgeは存在せず、expiresのみの指定となります。

js-cookieのconfig
/**
* Define when the cookie will be removed. Value can be a Number
* which will be interpreted as days from time of creation or a
* Date instance. If omitted, the cookie becomes a session cookie.
*/
expires?: number | Date | undefined;

引数の型で処理が異なる

上記のドキュメントに記載してあるのですが、js-cookieでは引数の型によって処理が変わります。
具体的にはnumber型の時は失効するまでの日数、Date型であれば失効する日時となります。

nookiesに当てはめると以下のような対応になります。

  • number型→maxAge
  • Date型→expires

実装時、これに気付けず、15 * 60 = 900を渡していました。😭

ドキュメントちゃんと読もう

当たり前ですが、新しい技術やライブラリを使うときにはドキュメントを読むことが大切です。
今回も実装前に見ておけば、このようなミスは無かったと思います。

(リリース前に気づけてよかった)

インターフェースの大切さ

今回のミスは完全にヒューマンエラーなのですが、それとは別にこのミス直面して改めてインターフェースの大切さを感じました。

他のライブラリの有効期限辺りのインターフェースに興味が湧いたので、Firebaseのコードを見に行くと、プロパティ名がexpiresInとなっていました。非常にわかりやすいですね。

もし次に自分が有効期限に関する実装をするなら

  • expiresIn
  • expiresAt

このあたりを使いたいなと思いました。

https://github.com/firebase/firebase-js-sdk/blob/main/packages/auth/src/api/authentication/token.ts#L98

Discussion