Cookie 与 Session 的作用与原理

发布于 2023-05-09 21:35:20 字数 4159 浏览 65 评论 0

Cookie 详解

简介

因为 HTTP 协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式 Web 应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。为了做到这点,就需要使用到 Cookie 了。服务器可以设置或读取 Cookies 中包含信息,借此维护用户跟服务器会话中的状态。

Cookie(复数形态:Cookies),是指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。

Cookie 是由服务端生成的,发送给客户端(通常是浏览器)的。Cookie 总是保存在客户端中,按在客户端中的存储位置,可分为内存 Cookie 和硬盘 Cookie:

内存 Cookie 由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。

硬盘 Cookie 保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。

工作原理

创建 Cookie

当用户第一次浏览某个使用 Cookie 的网站时,该网站的服务器就进行如下工作:

  • 该用户生成一个唯一的识别码(Cookie id),创建一个 Cookie 对象;
  • 默认情况下它是一个会话级别的 cookie,存储在浏览器的内存中,用户退出浏览器之后被删除。如果网站希望浏览器将该 Cookie 存储在磁盘上,则需要设置最大时效(maxAge),并给出一个以秒为单位的时间(将最大时效设为0则是命令浏览器删除该 Cookie);
  • 将 Cookie 放入到 HTTP 响应报头,将 Cookie 插入到一个 Set-Cookie HTTP 请求报头中。
  • 发送该 HTTP 响应报文。

设置存储 Cookie

浏览器收到该响应报文之后,根据报文头里的 Set-Cookied 特殊的指示,生成相应的 Cookie,保存在客户端。该 Cookie 里面记录着用户当前的信息。

发送 Cookie

当用户再次访问该网站时,浏览器首先检查所有存储的Cookies,如果某个存在该网站的 Cookie(即该 Cookie 所声明的作用范围大于等于将要请求的资源),则把该cookie附在请求资源的 HTTP 请求头上发送给服务器。

读取 Cookie

服务器接收到用户的HTTP请求报文之后,从报文头获取到该用户的Cookie,从里面找到所需要的东西。

作用

Cookie 的根本作用就是在客户端存储用户访问网站的一些信息。典型的应用有:

  1. 记住密码,下次自动登录。
  2. 购物车功能。
  3. 记录用户浏览数据,进行商品(广告)推荐。

缺陷

  1. Cookie 会被附加在每个 HTTP 请求中,所以无形中增加了流量。
  2. 由于在HTTP请求中的 Cookie 是明文传递的,所以安全性成问题。(除非用 HTTPS)
  3. Cookie 的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。

Session 详解

简介

Session 代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。Session是一种服务器端的机制,Session 对象用来存储特定用户会话所需的信息。

Session 由服务端生成,保存在服务器的内存、缓存、硬盘或数据库中。

工作原理

1、创建 Session

当用户访问到一个服务器,如果服务器启用 Session,服务器就要为该用户创建一个 SESSION,在创建这个 SESSION 的时候,服务器首先检查这个用户发来的请求里是否包含了一个 SESSION ID,如果包含了一个 SESSION ID 则说明之前该用户已经登陆过并为此用户创建过 SESSION,那服务器就按照这个 SESSION ID 把这个 SESSION 在服务器的内存中查找出来(如果查找不到,就有可能为他新创建一个),如果客户端请求里不包含有 SESSION ID,则为该客户端创建一个 SESSION 并生成一个与此 SESSION 相关的 SESSION ID。

这个 SESSION ID 是唯一的、不重复的、不容易找到规律的字符串,这个 SESSION ID 将被在本次响应中返回到客户端保存,而保存这个 SESSION ID 的正是COOKIE,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。

2、使用 Session

我们知道在 IE 中,我们可以在工具的 Internet 选项中把Cookie禁止,那么会不会出现把客户端的 Cookie 禁止了,那么 SESSIONID 就无法再用了呢?找了一些资料说明,可以有其他机制在 COOKIE 被禁止时仍然能够把 Session id 传递回服务器。

经常被使用的一种技术叫做 URL 重写,就是把 Session id 直接附加在URL路径的后面一种是作为 URL 路径的附加信息,表现形式为:

http://…./xxx;jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764; 

另一种是作为查询字符串附加在URL后面,表现形式为:

http://…../xxx?jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 

还有一种就是表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把 Session id 传递回服务器。

作用

Session的根本作用就是在服务端存储用户和服务器会话的一些信息。典型的应用有:

1、判断用户是否登录。

2、购物车功能。

Cookie 和 Session 的区别

1、存放位置不同

Cookie 保存在客户端,Session 保存在服务端。

2 、存取方式的不同

Cookie 中只能保管 ASCII 字符串,假如需求存取 Unicode 字符或者二进制数据,需求先进行编码。Cookie 中也不能直接存取Java对象。若要存储略微复杂的信息,运用 Cookie 是比拟艰难的。

而 Session 中能够存取任何类型的数据,包括而不限于 String、Integer、List、Map等。Session 中也能够直接保管 Java Bean 乃至任何 Java 类,对象等,运用起来十分便当。能够把 Session 看做是一个 Java 容器类。

3、安全性(隐私策略)的不同

Cookie 存储在浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而 Session 存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 假如选用 Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像 Google、Baidu 那样将 Cookie 信息加密,提交到服务器后再进行解密,保证 Cookie 中的信息只要本人能读得懂。而假如选择 Session 就省事多了,反正是放在服务器上,Session 里任何隐私都能够有效的保护。

4、有效期上的不同

只需要设置 Cookie 的过期时间属性为一个很大很大的数字,Cookie 就可以在浏览器保存很长时间。 由于 Session 依赖于名为 JSESSIONID 的 Cookie,而 Cookie JSESSIONID 的过期时间默许为–1,只需关闭了浏览器(一次会话结束),该 Session 就会失效。

5、对服务器造成的压力不同

Session 是保管在服务器端的,每个用户都会产生一个 Session。假如并发访问的用户十分多,会产生十分多的 Session,耗费大量的内存。而 Cookie 保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。

6、 跨域支持上的不同

Cookie 支持跨域名访问,例如将domain属性设置为 .baidu.com,则以 .baidu.com为后缀的一切域名均能够访问该 Cookie。跨域名 Cookie 如今被普遍用在网络中。而Session则不会支持跨域名访问。Session 仅在他所在的域名内有效。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

流心雨

暂无简介

文章
评论
305 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文