摘要:概念是服務(wù)器發(fā)送到用戶瀏覽器并保存在瀏覽器上的一塊數(shù)據(jù),它會(huì)在瀏覽器下一次發(fā)起請(qǐng)求時(shí)被攜帶并發(fā)送到服務(wù)器上。例如,如果設(shè)置了,則瀏覽器訪問其子域名如也會(huì)發(fā)送。的值可以被修改,,再次刷新頁面,重新發(fā)送請(qǐng)求,服務(wù)端控制臺(tái)就會(huì)打印。
概念
Cookie是服務(wù)器發(fā)送到用戶瀏覽器并保存在瀏覽器上的一塊數(shù)據(jù),它會(huì)在瀏覽器下一次發(fā)起請(qǐng)求時(shí)被攜帶并發(fā)送到服務(wù)器上?!狹DN來做個(gè)實(shí)驗(yàn)
服務(wù)端代碼
const http = require("http") const path = require("path") const url = require("url") const fs = require("fs") http.createServer((req, res) => { let { pathname, search } = url.parse(req.url) let cookie = req.headers.cookie console.log(JSON.stringify(cookie)) if (pathname === "/") { const file = path.resolve(__dirname, "./static/index.html") fs.readFile(file, (err, data) => { res.writeHead(200, { "Content-Type": "text/html", "Set-Cookie": ["author=nbb3210", "description=genius"] }) res.write(data.toString()) res.end() }) } else { res.end(pathname) } }).listen(3210)
./static/index.html內(nèi)容如下
Cookie Cookie
這里推薦一款chrome插件,EditThisCookie,方便進(jìn)行cookie的管理
啟動(dòng)服務(wù)端,當(dāng)我們第一次訪問http://localhost:3210/時(shí),服務(wù)端控制它打印出undefined;當(dāng)我們刷新頁面,再次訪問http://localhost:3210/時(shí),控制臺(tái)打印出"author=nbb3210; description=genius"。
"author=nbb3210; description=genius"是由服務(wù)器通過設(shè)置響應(yīng)頭
res.writeHead(200, { "Set-Cookie": ["author=nbb3210", "description=genius"] }) // 響應(yīng)頭 HTTP/1.1 200 OK Content-Type: text/html Set-Cookie: author=nbb3210 Set-Cookie: description=genius Date: Wed, 13 Dec 2017 12:35:39 GMT Connection: keep-alive Transfer-Encoding: chunked
發(fā)送給瀏覽器,下次發(fā)送請(qǐng)求時(shí),瀏覽器便會(huì)在請(qǐng)求頭上帶上這段信息。
// 瀏覽器第一次訪問服務(wù)端時(shí)發(fā)送的請(qǐng)求頭 GET / HTTP/1.1 Host: localhost:3210 Connection: keep-alive Cache-Control: max-age=0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36 Upgrade-Insecure-Requests: 1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
// 瀏覽器第二次訪問服務(wù)端時(shí)發(fā)送的請(qǐng)求頭,包含有了cookie信息 GET / HTTP/1.1 Host: localhost:3210 Connection: keep-alive Cache-Control: max-age=0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36 Upgrade-Insecure-Requests: 1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Cookie: author=nbb3210; description=genius
這樣,服務(wù)端就可以分辨出不同瀏覽器端發(fā)來的請(qǐng)求,記錄用戶的狀態(tài),同樣的請(qǐng)求,因?yàn)閏ookie的不同會(huì)有不同的響應(yīng)。總而言之,借助cookie,服務(wù)端能區(qū)分出“你是誰?”,從而記起“你之前干了啥”
cookie的屬性 Domain, Path服務(wù)端設(shè)置cookie時(shí),可以設(shè)置domain,path,從而確定該cookie的作用域。
例如,如果設(shè)置了Domain=mozilla.org,則瀏覽器訪問其子域名(如developer.mozilla.org)也會(huì)發(fā)送cookie。如果不設(shè)置domain,默認(rèn)為域名A(網(wǎng)站A)向?yàn)g覽器發(fā)送的cookie,只有在瀏覽器再次向域名A(網(wǎng)站A)發(fā)送請(qǐng)求時(shí)才會(huì)被帶上。
這里的path匹配scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]中的path。例如,在上面的實(shí)驗(yàn)中,修改代碼
"Set-Cookie": ["author=nbb3210; Path=/abc", "description=genius"]
用插件清除cookie,分別訪問http://localhost:3210/,http://localhost:3210/abd,http://localhost:3210/abc,http://localhost:3210/,服務(wù)端控制臺(tái)分別打印出undefined,"description=genius","author=nbb3210; description=genius","description=genius",因?yàn)橹挥械谌蔚膗rl與cookie的path設(shè)置匹配。
HttpOnlycookie的值可以被修改,document.cookie="author=ahhh",再次刷新頁面,重新發(fā)送請(qǐng)求,服務(wù)端控制臺(tái)就會(huì)打印"description=genius; author=ahhh"。
如果把自己的cookie修改成別人的cookie,那么就可以偽裝成別人,向服務(wù)端發(fā)送請(qǐng)求,這里的話。。。
如果cookie被設(shè)置了HttpOnly,那么再發(fā)送請(qǐng)求時(shí),cookie會(huì)被帶上,而瀏覽器端JavaScript無法修改該cookie。
例如,在上面的實(shí)驗(yàn)中,修改代碼
"Set-Cookie": ["author=nbb3210; HttpOnly", "description=genius"]
用插件清除cookie,兩次訪問http://localhost:3210/,服務(wù)端控制臺(tái)分別打印出undefined,"author=nbb3210; description=genius",其后,打開瀏覽器控制臺(tái),
> document.cookie < "description=genius" // 而 author=nbb3210 對(duì)于JavaScript來說是不可見的了
再次設(shè)置cookie
> document.cookie = "author=ahhh" < 控制臺(tái)打印 "author=ahhh"
并刷新頁面,重新訪問http://localhost:3210/,服務(wù)端控制臺(tái)仍打印"author=nbb3210; description=genius"
Secure只有在安全連接的https時(shí),cookie才會(huì)被發(fā)送
Expires, Max-Age前面的屬性確認(rèn)了cookie在什么時(shí)候會(huì)被發(fā)送,Expires,Max-Age確定了cookie在什么時(shí)間范圍內(nèi)有效。如果不設(shè)置這兩個(gè)屬性,cookie在瀏覽器關(guān)閉時(shí)就會(huì)被刪除,所以在關(guān)閉瀏覽器后,再次訪問http://localhost:3210/,服務(wù)端控制臺(tái)會(huì)打印undefined
Max-Age設(shè)置了cookie從被創(chuàng)建到消失持續(xù)的時(shí)間(s),如修改代碼
"Set-Cookie": ["author=nbb3210; Max-Age=30", "description=genius"]
用插件清除cookie,兩次訪問http://localhost:3210/,服務(wù)端控制臺(tái)分別打印出undefined,"author=nbb3210; description=genius",超過30s后再次訪問http://localhost:3210/,服務(wù)端控制臺(tái)打印出"description=genius",超過30s后,author=nbb3210失效了。
Expires指定了過期時(shí)間GMT,如果修改代碼
let date = new Date() date.setTime(date.getTime() + 30 * 1000) ... "Set-Cookie": [`author=nbb3210; Expires=${date.toUTCString()}`, "description=genius"]
其作用與設(shè)置Max-Age為30s的效果一樣
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92114.html
摘要:瀏覽器對(duì)這種行為進(jìn)行了限制。大多數(shù)情況下,該請(qǐng)求會(huì)失敗,因?yàn)樗蟮恼J(rèn)證信息。在請(qǐng)求頭中添加自定義例如在知乎中給文章點(diǎn)贊結(jié)合中對(duì)的的介紹,知乎的這種方式被稱為。 概念 CSRF,Cross Site Request Forgery,跨站請(qǐng)求偽造。 為什么跨站的請(qǐng)求需要偽造? 因?yàn)闉g覽器實(shí)現(xiàn)了同源策略,這里可以將站和源視為同一個(gè)概念。 同源策略 The same-origin polic...
摘要:上一篇文章簡單介紹了在本地開發(fā)環(huán)境中搭建服務(wù)端和客戶端,對(duì)單點(diǎn)登錄過程有了一個(gè)直觀的認(rèn)識(shí)之后,本篇將探討單點(diǎn)登錄的實(shí)現(xiàn)原理。因此引入服務(wù)端作為用戶信息鑒別和傳遞中介,達(dá)到單點(diǎn)登錄的效果。為該流程的實(shí)現(xiàn)類。表示對(duì)返回結(jié)果的處理。 上一篇文章簡單介紹了 CAS 5.2.2 在本地開發(fā)環(huán)境中搭建服務(wù)端和客戶端,對(duì)單點(diǎn)登錄過程有了一個(gè)直觀的認(rèn)識(shí)之后,本篇將探討 CAS 單點(diǎn)登錄的實(shí)現(xiàn)原理。 一...
閱讀 609·2021-10-08 10:20
閱讀 1496·2021-09-23 11:22
閱讀 3226·2019-08-30 15:55
閱讀 1612·2019-08-28 18:25
閱讀 1870·2019-08-28 18:14
閱讀 1243·2019-08-26 11:37
閱讀 2906·2019-08-26 10:18
閱讀 2431·2019-08-23 18:39