Cookie、Session、LocalStorage、SessionStorage

Cookie

【牢记:前端永远不要读/写Cookie

定义

HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份,所以我们浏览器仅仅用HTTP协议是远远不够的。
Cookie的本质是HTTP协议的内容,是一小段的文本信息(key-value格式)。

特点
  1. 服务器通过Set-Cookie响应头设置cookie
  2. 浏览器得到cookie后,每次请求都要带上这个cookie
  3. 服务器读取cookie就知道登录用户的信息
  4. cookie默认的最大存储量是4k左右
  5. cookie默认在网页关闭后就失效,后台代码可以任意设置cookie的过期时间。
Cookie机制
Cookie的设置和读取

设置:

response.setHeader('Set-Cookie', `sign_in_email = ${email}`)

设置后,浏览器端的该响应头(Response Headers)会存在Set-Cookie字段,其他同源路径的请求头(Request Headers)会存在Cookie字段。
读取:

let string = request.headers.cookie //是一个字符串
关于Cookie的一些问题
  1. 我在 Chrome 登录了得到 Cookie,用 Safari 访问,Safari 会带上 Cookie 吗?
    答:no
  2. Cookie 存在哪?
    答: Windows存在 C 盘的一个文件里
  3. Cookie会被用户篡改吗?
    答: 可以,所以cookie是不安全的。
  4. Cookie 有效期吗?
    答: 默认有效期20分钟左右,不同浏览器策略不同
    后端可以强制设置有效期,具体语法看 MDN
  5. Cookie 遵守同源策略吗
    答:也有,不过跟 AJAX 的同源策略稍微有些不同。
    当请求 qq.com 下的资源时,浏览器会默认带上 qq.com 对应的 Cookie,不会带上 baidu.com 对应的 Cookie
    当请求 v.qq.com 下的资源时,浏览器不仅会带上 v.qq.com 的Cookie,还会带上 qq.com 的 Cookie
    另外 Cookie 还可以根据路径做限制,请自行了解,这个功能用得比较少。
  6. 如何设置Cookie的过期时间
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date> 
//cookie 的最长有效时间,形式为符合 HTTP-date 规范的时间戳
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit> 
//在 cookie 失效之前需要经过的秒数

前端:
expires:

var date=new Date(); 
date.setTime(date.getTime()+30*60*1000); //设置date为当前时间+30分 
document.cookie="key=value; expires="+date.toGMTString(); //将date赋值给expires

max-age:

document.cookie="key=value; Max-Age= 300";

后端
expires:

var date=new Date(); 
date.setTime(date.getTime()+30*60*1000); //设置date为当前时间+30分 
document.cookie="key=value; expires="+date.toGMTString(); //将date赋值给expires

max-age:

document.cookie="key=value; Max-Age= 300";
  1. 删除Cookie
    原理就是使Cookie立马失效

expires:

document.cookie="key=value; expires= Thu, 01 Jan 1970 00:00:00 GMT";

或者是

var date=new Date(0); 
date.setTime(date.getTime()+30*60*1000); //设置date为当前时间+30分 
document.cookie="key=value; expires="+date.toGMTString(); //将date赋值给expires

max-age:

document.cookie="key=value; Max-Age= 0"
Set-Cookie

响应首部 Set-Cookie被用来由服务器端向客户端发送 cookie

详细解析见:Set-Cookie(MDN)
语法:

Set-Cookie: <cookie-name>=<cookie-value>  //普通用法
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date> //cookie 的最长有效时间,形式为符合 HTTP-date 规范的时间戳
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit> //在 cookie 失效之前需要经过的秒数
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value> //指定 cookie 可以送达的主机名
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value> //指定一个 URL 路径,这个路径必须出现在要请求的资源的路径中才可以发送 Cookie 首部
Set-Cookie: <cookie-name>=<cookie-value>; Secure //一个带有安全属性的 cookie 只有在请求使用SSL和HTTPS协议的时候才会被发送到服务器。
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly //设置了 HttpOnly 属性的 cookie 不能使用 JavaScript 经由  Document.cookie属性、XMLHttpRequest和  Request 的APIs 进行访问


Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
//以上两个可选,允许服务器设定一则 cookie 不随着跨域请求一起发送,这样可以在一定程度上防范跨站请求伪造攻击

// Multiple directives are also possible, for example:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly

Session

特点:
  1. 将sessionId(随机数)通过Cookie发送给客户端
  2. 客户端访问服务器时,服务器读取sessionId
  3. 服务器有一块内存(哈希表)保存了所有session
  4. 通过SessionId我们可以得到对应用户的隐私信息,如id等
  5. 这块内存(哈希表)就是服务器上的所有session

SessionStorage

特点
  1. SessionStorage跟HTTP无关
  2. HTTP不会带上SessionStorage的值
  3. 只有相同域名的页面才能互相读取SessionStorage
  4. 每个域名SessionStorage最大存储量为5Mb左右
  5. SessionStorage在用户关闭页面(会话结束)后失效

LocalStorage

特点
  1. localStorage 跟HTTP无关
  2. HTTP不会带上localStorage的值
  3. 只有相同域名的页面才能互相读取localStorage
  4. 每个域名localStorage 最大存储量为5Mb左右
  5. 常用场景:记录有没有提示过用户(没有用的信息,不能记录密码)等跨页面存储内容的场景
  6. localstorage理论上永久有效,没办法设置过期时间,除非用户清理缓存
全局对象

window.localStorage是一个名为Storage的全局对象,日常主要使用以下三个方法:

  1. localStorage.getItem(key): 获取指定key本地存储的值。
  2. localStorage.setItem(key): 将value存储到key字段。
  3. localStorage.remoteItem(key): 删除指定key本地存储的值。
本质

localStorage是html5提供的一个API,localStorage的实质是一个哈希
localStorage只能存string,不能存函数对象等,存了也没用,会转化成string。
localStorage可以将内容存到C盘的文件里,以便以后使用。没有localStorage之前都不能这样操作。

session是服务器上的哈希,localStorage是浏览器上的哈希。

问题:cookie和localStorage为什么会放在一起比较
  1. localStorage是一个HTML5新出的API,在这之前,跨页面的存储都是通过Cookie进行的
  2. 但是Cookie进行跨页面存储需要带上一个字符串,大小在1k左右,但是一个请求才120B,这会使得请求变慢。localStorage不会拖慢请求速度。
  3. Cookie和localStorage都是存储在C盘文件夹中,都可以进行长久化存储
  4. 前端永远不要读写Cookie

面试题

  1. cookiesession是什么关系?
    答:
    1.Cookie 保存在客户端,每次都随请求发送给 Server。
    2.Session 保存在 Server 的内存里,其 Session ID 是通过 Cookie 发送给客户端的

  2. cookielocalstorage的区别是什么?
    答:
    1.最大的区别是cookie是HTTP协议的内容,cookie每次请求都会带给服务器,而local storage不会,因为跟HTTP无关。
    2.然后可以回答最大存储量的不同,Cookie的最大存储量是4k左右,而LocalStorage的最大存储量是5Mb左右。

  3. localstoragesessionStorage的区别
    答: sessionstorage在用户关闭页面(会话结束)后失效。local storage永久有效,除非用户清理缓存。

  4. Cache-Control: max-age=1000 缓存 与 ETag 的「缓存」有什么区别?
    答:
    1.Cache-Control: max-age=1000缓存 : 指在1000秒内,不去向服务器进行请求,直接在缓存中拿到文件。
    2.ETag的「缓存」: 指向服务器进行请求,如果文件内容没有变化,即md5编码验证相等,则不去下载文件。

最大的区别就是Cache-Control: max-age=1000在一定时间内不发起请求,而Etag始终发起请求,但不一定需要下载文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容