「expires=」をエンコードすることは想定されていません。それはあなたが望むものではない「expires%3D」に変わります。それに加えて、「;」をエンコードしないため、「encodeURI」を使用するのは悪い考えかもしれません。および必要に応じて「,」。
cookie 値をエンコードするために encodeURIComponent を使用できますが、技術的には escape() を使用して cookie 値をエンコードするのが正しいでしょう。
そう...
document.cookie = "count=" + encodeURIComponent(count.toString()) + "; expires=" + exDate.toUTCString();
...あなたが望むことをすべきです。
クッキーはいくつかの部分で構成されています。私たちは主に名前、価値、有効期限に関心があります。
(公式回答終わり)
Cookie のエンコードに関する混乱を解消しましょう
疑わしい場合は、RFC に連絡してください。Web で見つけたものをそのまま選択するのではなく、機能していると思われるものを選んでください。
cookie-name のタイプはtokenです。つまり、その中で使用できる値は
0x21-0x27、0x2A -0x2B、 0x2D-0x2E 、0x30-0x39、0x41-0x5A、0x5E-0x7A、および0x7Eのみです。
つまり、次の値はパーセントでエンコードする必要があります:
0x00-0x20、'('、')'、','、'/'、':'、';' 、「<」、「=」、「>」、「?」、'、「[」、「]」、「{」、「}」、および0x7F-0xFF。
cookie-value のタイプはcookie-octetです。つまり、その中で許可される値は
0x21、0x23-0x2B、0x2D-0x3A、0x3C-0x5B、0x5D-0x7E のみです。
つまり、次の値はパーセントでエンコードする必要があります:
0x00-0x20、0x22、','、';' 、''および0x7F-0xFF。
これで、正しく行っているように、有効期限が toUTCString() を使用してエンコードされます。
結果は次のようになります: Wed, 09 Jun 2021 10:18:14 GMT
-したがって、コンマが含まれます。しかし!cookie-name と cookie-value 文字列を除いて、何もエンコードしないことになっています。
注: W3Schoolsは、escape() は JavaScript 1.5 で廃止されたと述べていますが、Cookie に encodeURI() または encodeURIComponent() を使用することは技術的に正しくありません。クッキーに escape() を使用することは技術的に正しいです。
RFC 6265 セクション 5.4には、次のように明確に記載されています。
注: その名前にもかかわらず、cookie-string は実際には一連の文字では
なく一連のオクテットです。cookie 文字列
(またはその構成要素) を (たとえば、ユーザーに提示するために) 文字のシーケンスに変換するために、ユーザー エージェントは、
UTF-8 文字エンコーディング [RFC3629] を
使用してオクテット シーケンスをデコードしようとする場合があります。ただし、すべてのオクテット シーケンスが有効な UTF-8 であるとは限らないため、このデコードは失敗する可能性があります。
decodeURIComponent() は Unicode 文字列用であり、0x00 から 0xFF の間のバイト値でチョークするため、安全に使用することはできません。一方、unescape() は文字列用ではなく、8 ビット バイト シーケンス用です。octets、ただしバイトシーケンスにユニコード文字が含まれていない場合のみ。
ただし、 Cookie 値に Unicode 文字が含まれている場合は、encodeURIComponent()/decodeURIComponent() を使用する必要がありますが、サーバーは受信したいものを正確に送信しない可能性があるため、例外もキャッチする必要があります。