クッキー (Cookie)の 長さ制限

昔と違い(いつ?)クッキーについては今現在RFC6265で定義されている。

http://www.rfc-editor.org/rfc/rfc6265.txt

(RFC万歳!!)
個人的にはRFCのおかげでインターネットが「自由、平等」という未来を築いていけると思い、
夢中になってRFC関連書籍、RFCドキュメント、有志による日本語訳を読んでいた頃があった(2000年頃)

アプリケーションレベルのトラブル、セキュリティ対策に起因して起きるTCPでのコネクション断。
どれだけRFCを引き合いに出して説明し、調査依頼や当事者の説得に走ったことか。
RFCがあったからこそ自信をもってトラブル当事者と話ができた。

あ、つい話がそれてしまった。今日はクッキーの制限に留意したプログラムの話でした。
RFC6265の制限に関する抜粋

----------------------------------------------------------------------------
6. Implementation Considerations

6.1. Limits

Practical user agent implementations have limits on the number and
size of cookies that they can store. General-use user agents SHOULD
provide each of the following minimum capabilities:

o At least 4096 bytes per cookie (as measured by the sum of the
length of the cookie's name, value, and attributes).

o At least 50 cookies per domain.

o At least 3000 cookies total.

----------------------------------------------------------------------------

で、ここで最初の2つの制限
1.クッキーの変数名も含めたすべての文字列長を4096バイトに収める
 最低限の条件なのでブラウザによってはもっと容量を確保しているかも知れません。
2.1ドメインで50個のクッキー
 こちらも最低の実装条件なのでブラウザによってはもっといけるかも。

という事で、
ちょっと志向を変えて数字とアルファベットのみの値でカンマ区切りのクッキー保存サンプルコードを
JavaScriptで。(動作検証していません)

function getcookie(key) {
    "use strict";
    var cookie_all = document.cookie.split('; '), i=-1, ck;

    while (++i < cookie_all.length) {
        ck = cookie_all[i].split('=');  //キーと値を取り出す
        if (ck[0] == key) {
            return(unescape(ck[1]));    //値を返す
        }
    }
    return('');
}

//引数は、クッキー名(key)と追加する値(val),保存期間日数(day),4096バイトを超えた場合のエラーメッセージ
//サンプルなのでクッキー名や値のエラーチェックはしていません。
function setcookieCsvAdd(key, val, day, overMsg){
    "use strict";
    var c = getcookie(key), exist = c.split(','), i, maxAge, max, lifetime=86400000,cookieStr='';

    //簡易エラーチェック
    if (day===undefined || day===0){
        maxAge = '';
    } else if (typeof day !== 'number') {
        return false;
    } else {
        max = lifetime * day;
        maxAge = ';max-age=' + max;
    }
    
    if (exist.length > 0){
        for(i=0; i<exist.length; i++){
            //指定された値がすでにセットされている場合は、なにもせずに戻る。
            if (val === exist[i]){
                return true;
            }
        }
    }

    if (c===undefined || c===''){
        c = val;
    } else {
        c += ','+val;
    }

  cookieStr = key+'='+encodeURIComponent(c)+maxAge+';path=/';
    //最低限の実装長を超えていた場合はエラーとする。
    if (cookieStr.length > 4096) {
        alert(overMsg);
        return false;
    }
   //クッキーセット
    document.cookie = cookieStr;
    return true;
}

残るは
o At least 3000 cookies total.
これをどうチェックするかが課題。
2つの制限を超えていなくとも、ブラウザ全体の制限を超えた場合はどうなるんだろうか?