Cookieの有効期限を15分に設定したはずが900日になっていた話
起こったこと
私たちの開発するプロダクトでは一部の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ではexpires
とmaxAge
が指定でき、
expires?: Date;
maxAge?: number;
js-cookieではmaxAge
は存在せず、expires
のみの指定となります。
/**
* 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
このあたりを使いたいなと思いました。
Discussion