クッキー
クッキーは、サーバーがHTTPレスポンスでクライアントに送信する小さな情報で、ブラウザは後続のリクエストでサーバーに送信します。この技術は、多くのインタラクティブなWebサイトの基本的な構成要素であり、状態を追加することで、認証(セッション参照)、ショッピングカート、ユーザー設定、および「ログイン」しているユーザーを記憶する必要があるその他の多くの機能を構築できます。
RemixのCookie
インターフェースは、クッキーのメタデータのための論理的で再利用可能なコンテナを提供します。
クッキーの使用
手動でこれらのクッキーを作成することもできますが、セッションストレージを使用する方が一般的です。
Remixでは、通常、loader
関数またはaction
関数(ミューテーションを参照)でクッキーを操作します。これらの関数は、データの読み書きが必要な場所です。
たとえば、電子商取引サイトに、現在セール中の商品をチェックするようにユーザーに促すバナーがあるとします。バナーはホームページの上部に表示され、ユーザーが少なくとも1週間は表示されないように、バナーを非表示にするボタンが横に付いています。
まず、クッキーを作成します。
次に、クッキーをimport
し、loader
関数またはaction
関数で使用できます。この場合のloader
は、ユーザー設定の値をチェックするだけで、コンポーネントで使用してバナーを表示するかどうかを判断します。ボタンをクリックすると、<form>
はサーバー上のaction
を呼び出し、バナーなしでページを再読み込みします。
注: 現時点では、アプリに必要なすべてのクッキーを*.server.ts
ファイルに作成し、ルートモジュールにimport
することをお勧めします。これにより、Remixコンパイラは、これらのimport
をブラウザビルドから正しく削除できるため、ブラウザビルドでは必要ありません。この注意書きは、今後削除される予定です。
クッキー属性
クッキーには、有効期限、アクセス方法、送信先を制御するいくつかの属性があります。これらの属性は、createCookie(name, options)
で指定するか、Set-Cookie
ヘッダーが生成されるときのserialize()
中に指定することができます。
これらの属性の詳細については、属性に関する詳細情報を参照して、これらの属性がどのように機能するかを理解してください。
クッキーの署名
クッキーのコンテンツを受け取ったときに自動的に検証できるように、クッキーに署名することができます。HTTPヘッダーを偽造することは比較的簡単であるため、認証情報(セッションを参照)など、偽造したくない情報は署名することをお勧めします。
クッキーに署名するには、最初にクッキーを作成するときに、1つ以上のsecrets
を指定します。
1つ以上のsecrets
を持つクッキーは、クッキーの整合性を確保する方法で保存および検証されます。
secrets
配列の先頭に新しいsecrets
を追加することで、secrets
をローテーションできます。古いsecrets
で署名されたクッキーは、cookie.parse()
で引き続き正常にデコードされ、最新のsecrets
(配列の最初のsecrets
)は、cookie.serialize()
で作成される送信されるクッキーに常に使用されます。
createCookie
サーバーからブラウザクッキーを管理するための論理的なコンテナを作成します。
各属性の詳細については、MDN Set-Cookieドキュメントを参照してください。
isCookie
オブジェクトがRemixクッキーコンテナである場合はtrue
を返します。
クッキーAPI
クッキーコンテナは、createCookie
から返され、いくつかのプロパティとメソッドを持っています。
cookie.name
Cookie
とSet-Cookie
のHTTPヘッダーで使用されるクッキーの名前。
cookie.parse()
指定されたCookie
ヘッダーからこのクッキーの値を抽出して返します。
cookie.serialize()
値をシリアライズし、このクッキーのオプションと組み合わせてSet-Cookie
ヘッダーを作成します。これは、送信されるResponse
で使用できます。
cookie.isSigned
クッキーがsecrets
を使用している場合はtrue
、それ以外の場合はfalse
になります。
cookie.expires
このクッキーが期限切れになるDate
。クッキーにmaxAge
とexpires
の両方がある場合、この値は、Max-Age
がExpires
よりも優先されるため、現在の時刻からmaxAge
の値を加えた日時になります。