ホームページ  >  記事  >  バックエンド開発  >  HTTP Cookieの状態管理の仕組みを詳しく解説

HTTP Cookieの状態管理の仕組みを詳しく解説

*文
*文オリジナル
2018-01-05 14:12:351508ブラウズ

Cookie は 1993 年 3 月に Netscape の従業員である Lou Montulli によって初めて発明され、その後 W3C によって採用されました。現在、Cookie は IE、Chrome、Firefox、Opera などのすべての主流ブラウザーでサポートされています。

HTTP クッキー。「クッキー」と呼ばれることが多く、古くから存在していますが、まだ完全には理解されていません。主な問題は、Cookie がバックドアやウイルスであると考えられたり、Cookie がどのように機能するかを単に理解していないなど、多くの誤解があることです。 2 番目の問題は、Cookie の一貫したインターフェイスが欠如していることです。これらの問題にもかかわらず、Cookie は依然として Web 開発において非常に重要な役割を果たしているため、もし Cookie が代わりに使用されずに消滅すると、私たちのお気に入りの Web アプリケーションの多くが役に立たなくなるでしょう。

1. Cookie の起源

Cookie は 1993 年 3 月に Netscape の従業員である Lou Montulli によって最初に発明され、その後 W3C によって採用されました。現在、Cookie は IE などのすべての主流ブラウザーで標準となっています。 Chrome、Firefox、Opera などがすべてサポートされています。


Cookie は、HTTP プロトコルの固有の欠陥により生まれました。HTTP は、リクエスト/レスポンスが完了すると、クライアントとサーバー間の接続が閉じられ、新しいデータを確立する必要があります。再度データを交換して接続してください。これは、サーバーが接続からセッションを追跡できない、つまり、サーバーがどのクライアントであるかを認識できないことを意味します。


ログイン/ショッピングカートなどの一部の一般的なアプリケーションは実装できません。たとえば、ユーザー A がショッピング モールで購入した商品は、ユーザー A がいつ購入しても同じセッションに属しており、ユーザー B またはユーザー C のショッピング カートに入れることはできません。同じセッションに属していません。


基本原理は図の通りです



2. Cookieの操作

Cookieに対する操作には以下のものが含まれます

1. 名前(Name)

2. 値(Value)
3. Domain (ドメイン)
4. Path
5.Expires
6. Secure flag(Secure)
7.HttpOnly (サーバー側のみ)

Cookie は主にサーバー側で作成されますが、JS も作成できることに注意してください。 used Cookieは作成されますが、HttpOnly型のJSは作成できません。


ブラウザが提供するCookie API(document.cookie)は単純すぎるため、少しカプセル化できます。たとえば、次のようにsetter/getter cookie関数を使用するとはるかに便利です

/*
* JS 写cookie和读cookie操作
*
* **取cookie**
* cookie(name)
*
* **写cookie**
* cookie(name, value)
* cookie(name, value, option)
*/
var cookie = function(name, value, option) {
var doc = document
if (value != undefined) { // set 
option = option || {}
if (value === null) {
value = ''
option.expires = -1
}
var expires = ''
if (option.expires && (typeof option.expires == 'number' || option.expires.toUTCString)) {
var date = new Date
if (typeof option.expires == 'number') {
date.setTime(date.getTime() + (option.expires * 24 * 60 * 60 * 1000))
} else {
date = option.expires
}
// for IE
expires = '; expires=' + date.toUTCString()
}
var path = option.path ? '; path=' + option.path : ''
var domain = option.domain ? '; domain=' + option.domain : ''
var secure = option.secure ? '; secure' : ''
doc.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('')
} else { // get 
var cookieValue = null
if (doc.cookie && doc.cookie != '') {
var cookies = doc.cookie.split(';')
for (var i = 0; i < cookies.length; i++) {
var cookie = $.trim(cookies[i]).split(&#39;=&#39;)
if ( cookie[0] == name && cookie.length > 1 ) {
try {
cookieValue = decodeURIComponent(cookie[1])
} catch(e) {
cookieValue = cookie[1]
}
break
}
}
}
return cookieValue
}
};

3. type

1. 通常の Cookie はサーバー側と JS の両方で作成できます

2. HttpOnly Cookie は、主にセキュリティ上の理由から、JS でのみ作成できます
3.安全な Cookie (https のみ)、サーバー側 どちらも JS で作成できます。JS は HTTPS でのみアクセスできます

たとえば、テスト ページでは、c1、c2、c3 という 3 つの Cookie を植えました

$d1 = mktime(1,1,1,1,1,2018);
// 普通cookie
setcookie("c1", "Jack", $d1); 
// 安全的cookie,仅https,第6个参数
setcookie("c2", "John", $d1, NULL, NULL, TRUE); 
// HttpOnly cookie 第7个参数
setcookie("c3", "Resig", $d1, NULL, NULL, NULL, TRUE);

Firefox を使用しますアクセスするには



私が植えました 3つすべてが利用可能で、saeutはSina Cloudからのものです。

Firebug コンソールに document.cookie と入力します



c2 と c3 にアクセスできないことがわかります。 c2 は安全な Cookie であり、https プロトコルでアクセスする必要があります。c3 は httpOnly であり、JS ではアクセスできないことに注意してください。


アクセスプロトコルを https: に変更し、firebug をコンソールに切り替えて document.cookie を入力すると、c2 が表示され、それにアクセスできます

4. Cookie ピット


1. Cookieが大きすぎる、または多すぎると、ページにアクセスするとエラーが報告されます。たとえば、次のようなプロンプトが表示されます


そのため、サイトのCookieを管理する必要があり、自由にCookieを植えることはできません。 。さらに、Cookie を指定された範囲に制限するパスを指定するようにしてください。


Web サイトのブラウザーcookielimits.squawky.net は、各ブラウザーの Cookie サイズを記録します



2. 中国語を保存する場合は Unicode エンコード (encodeURIComponent) が必要です。そうしないと、保存されたコードが文字化けします


:

PHP で単純なキャッシュ クラスを共有します

PHPの自動読み込みautoloadとnamespaceメソッドのまとめ

PHPでカプセル化されたMysql操作クラスの詳細説明

以上がHTTP Cookieの状態管理の仕組みを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。