Cookie深度揭秘

Cookie概述

HTTP是一种无状态的请求/响应协议,用户通过浏览器访问Web站点后,Web服务端没有可用信息来判断是哪个用户发起的请求,更加无法知道下次访问的还是不是上次访问的用户,无法识别当前用户。最初,为了解决这个问题出现了很多解决方案,例如客户端IP地址跟踪、用户登录认证、URL中嵌入识别信息等,但都没有很好的解决根本问题。然而,Cookie的设计实现很好的解决了这个问题。用户通过浏览器访问Web站点后,服务端会将一些Key/Value组合的键值对通过Set-Cookie或Set-Cookie2返回给浏览器,用户再次访问Web站点时浏览器会将符合条件的键值对再发送给服务端,这样服务端就可以通过这个键值信息识别出当前用户。

Cookie分类

Cookie可以分为两类:会话Cookie和持久Cookie。会话Cookie是一种临时Cookie,没有设置它的有效期,当用户退出浏览器的时候,它将会被删除。当设置了Cookie的有效期后,它就是持久Cookie,它可以被存储到硬盘上,当用户退出浏览器或机器重启时,它依然存在,可以被再次读取使用。

Cookie版本

当前可使用的Cookie规范有两个版本:Cookie版本0和Cookie版本1。Cookie版本1是对Cookie版本0的扩展,版本1可以和版本0互操作,但是Cookie版本1没有Cookie版本0使用的广泛。

Cookie版本0属性

版本0定义了Set-Cookie响应首部、Cookie请求首部。
Set-Cookie响应首部,其实就是服务端返回的Cookie信息,具体的语法如下:

Set-Cookie:key=value;expires=date;domain=domain;path=path;secure

Key/value表示在服务端可跟踪、可识别的用户信息;expires表示Cookie的结束日期,如果没指定,Cookie会在用户退出浏览器时过期;domain告诉浏览器这个Cookie可以被发送到哪个域名,如果没指定,默认为产生Cookie的服务器主机名,浏览器会存储很多不同网站的Cookie,浏览器会根据domain的值将Cookie发送到对应的域名下;path指定Cookie对哪些请求路径生效,如果没指定,默认为产生Cookie的URL路径;secure表示在使用SSL安全连接时才发送Cookie,若没设置secure,则没限制。例如:

Set-Cookie:member_id=1496800101;expires=Tuesday 16-Aug-01 22:10:11 GMT;domain=“abc.com";path=/member;secure

Cookie请求首部,就是浏览器请求服务端时发送的Cookie信息,具体语法如下:

Cookie:key1=value1;key2=value2;key3=value3...

例如:

Cookie:member_id=1496800101

Cookie版本1属性

版本1定义了Set-Cookie2响应首部、Cookie2请求首部。这个版本做了如下一些改动:
1.为每个Cookie添加了解释性文本,用于解释其目的;
2.用户退出浏览器时,允许不考虑过期时间,将Cookie销毁;
3.使用相对秒数来设置Cookie的生存时间;
4.对Cookie的生效限制,添加了端口条件,可以通过domain、path和port来共同限制;
5.在发送Cookie请求首部时,会将domain、path和port一起发送到服务端;
6.为了实现版本的互操作,使用版本号;
7.使用$前缀来附加服务端返回的Cookie信息。

Set-Cookie2响应首部具体语法如下:

Set-Cookie2:key=value;Version=“1”;Comment=Comment;CommentURL=CommentURL;Discard;Max-Age=age;domain=domain;path=path;Port=Port;secure

Version对应Cookie规范的版本;Comment说明服务器如何去使用这个Cookie;CommentURL表示一个URL,指向描述该Cookie的文档;Discard表示如果设置此标识,会在浏览器退出时放弃此Cookie;Max-Age使用相对当前时间的秒数来设置Cookie的生命周期;Port表示对Cookie生效的端口,多个端口可用逗号分隔。

Cookie2请求首部会回传每个Cookie的附加信息,也就是Set-Cookie2中的属性信息,例如:

Cookie:$Version=“1”;member_id=14690801;$Domain=“abc.com”;$path=/member

Cookie缺点

虽然Cookie可以很好的解决识别用户的问题,但是,它也有很多的缺点:
1.不安全,容易被破坏或盗取;
2.Cookie存储在浏览器中,浏览器对Cookie的数量和大小有限制;
3.Cookie中数据量很大时对性能和带宽有所损耗;


全部评论
接受有条理的吐槽!
点赞 回复 分享
发布于 2017-09-06 11:23

相关推荐

11-05 15:12
门头沟学院 Java
📍面试公司:数字马力🕐面试时间:11/5💻面试岗位:后端开发❓面试问题:0. 询问专业课程    (以为会问计网之类的,结果没有1. 策略模式的好处    (问题来自于实习2. 分布式锁3. 乐观锁、悲观锁3.1 高并发情况下应该用哪个4. cookie、session、token的区别,以及使用场景    (这个答差了,面试官想听的是为什么要用cookie、session、token,什么时候用5. redis的作用6. hashmap,hashtable,concurrenthashmap的区别7. 分布式事务8. rabbitmq消息有序性,延迟消息8.1 具体实践9. 如何使用redis实现一个排行榜10. 对nacos的看法11. 对mq的看法12. spring的事务传递性        (不会13. 对ai的了解13.1    如rag,agent,sse,幻觉,prompt的了解14. 登录鉴权流程    (这个问了之后才问的 cookie、session、token15. simpledateformat 是线程安全吗?为什么        (不知道为什么线程不安全16. 线程池参数17. 什么是守护线程            (不会反问:Q: 看重校招生的什么A: 筛选项是  基础,加分项是  大模型之类的其他的没什么了🙌面试感想:1. 面试官人很好,我不会的东西都会告诉我答案(除了守护线程2. 面试的环境比较嘈杂3. 面试官中途听我吟唱八股的时候看了俩次手机4. 由于本人的习惯,在回答问题的时候喜欢东张西望,中途被面试官建议不要到处看总的来说面试体验挺不错的,不过估计挂了
牛客25899229...:一面过了
查看21道真题和解析
点赞 评论 收藏
分享
评论
点赞
41
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务