Cookie和Session简述

Cookie概述

HTTP Cookie是服务器发送到客户端浏览器保存在本地一小块文本数据。浏览器下次向同一服务器发送请求时会携带这个Cookie并且发送给服务器。

Cookie使得无状态的HTTP协议能够记录一些信息。

Cookie常用于会话状态管理(如用户登录状态、购物车、游戏分数或其他需要记录的信息)、浏览器行为跟踪(如跟踪分析用户行为等)。

浏览器通过请求头中的Cookie将数据发送给服务器,服务器通过响应头中的Set-Cookie将cookie返回给浏览器。

Cookie使用

Cookie可以指定属性:

  • Expires:过期时间。如果没有标明这个属性,说明是一个会话期Cookie,一个会话结束于客户端被关闭时,这意味着会话期 cookie 在彼时会被移除。很多Web浏览器支持会话恢复功能,这个功能可以使浏览器保留所有的tab标签,然后在重新打开浏览器的时候将其还原。与此同时,cookie 也会恢复,就跟从来没有关闭浏览器一样。
  • Max-Age:有效期。在 cookie 失效之前需要经过的秒数。假如Expires和Max-Age都存在,那么Max-Age优先级更高。
  • Domain:指定cookie可以送达的主机名。假如没有指定,那么默认值为当前文档访问地址中的主机部分。域名设置
  • Path:指定一个 URL 路径,这个路径必须出现在要请求的资源的路径中才可以发送 Cookie 首部。
  • Secure:一个带有安全属性的 cookie 只有在请求使用SSL和HTTPS协议的时候才会被发送到服务器。然而,保密或敏感信息永远不要在 HTTP cookie 中存储或传输,因为整个机制从本质上来说都是不安全的,比如前述协议并不意味着所有的信息都是经过加密的。
  • HttpOnly:设置了 HttpOnly 属性的 cookie 不能使用 JavaScript 经由 Document.cookie 属性、XMLHttpRequest 和 Request APIs 进行访问,以防范跨站脚本攻击(XSS)。

Cookie前缀
名称中包含 __Secure- 或 __Host- 前缀的 cookie,只可以应用在使用了安全连接(HTTPS)的域中,需要同时设置 secure 指令。另外,假如 cookie 以 __Host- 为前缀,那么 path 属性的值必须为 “/” (表示整个站点),且不能含有 domain 属性。对于不支持 cookie 前缀的客户端,无法保证这些附加的条件成立,所以 cookie 总是被接受的。

// 当响应来自于一个安全域(HTTPS)的时候,二者都可以被客户端接受
Set-Cookie: __Secure-ID=123; Secure; Domain=example.com
Set-Cookie: __Host-ID=123; Secure; Path=/
// 缺少 Secure 指令,会被拒绝
Set-Cookie: __Secure-id=1
// 缺少 Path=/ 指令,会被拒绝
Set-Cookie: __Host-id=1; Secure
// 由于设置了 domain 属性,会被拒绝
Set-Cookie: __Host-id=1; Secure; Path=/; domain=example.com

Cookie安全

当机器处于不安全环境时,切记不能通过HTTP Cookie存储、传输敏感信息

这里有篇文章讲述了XSS和CSRF

会话劫持和XSS

在Web应用中,cookie常被用来标记用户和授权会话。
常用的窃取cookie的方法有利用社会工程学攻击和利用应用程序漏洞进行XSS攻击
XSS是通过在网站上注入恶意的客户端代码,通过这些恶意脚本篡改网页,从而在用户浏览网页时,对用户浏览器进行控制或窃取用户信息。

CSRF

Cross Site Request Forgery 跨站请求伪造,劫持受信任用户向服务器发送非预期请求的攻击方式。
通常情况下,CSRF 攻击是攻击者借助受害者的 Cookie 骗取服务器的信任,可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击服务器,从而在并未授权的情况下执行在权限保护之下的操作。

Session概述

session是存储在服务器可以存放状态(数据)一次客户端与服务端会话
session会话机制也是为了解决HTTP无状态的会话跟踪。

当用户请求访问服务器是,会生成一个sessionid,用于标识客户端。每当客户端访问时,先检查是否存在sessionid,如果存在就找到了对应的session。这个sessionid就是存储在cookie中,所以session默认是基于cookie的。

当客户端禁用cookie,那么就需要通过URL重写隐藏表单域的方式进行会话跟踪。

session的生命周期
session是有失效时间的,默认为30分钟,可以在服务器端进行设置。服务器端也可调用HttpSession的invalidate()方法销毁session对象。
如果服务器正常关闭,session就会被持久化(写入到文件中,因为session默认的超时时间为30分钟,正常关闭后,就会将session持久化,等30分钟后,就会被删除)

Cookie Session
存储位置 客户端 服务端
安全程度 不安全,cookie劫持、XSS、CSRF 比较安全
占用资源 占用一小部分客户端空间 占用服务端内存、CPU、磁盘
数据存储 单个cookie不超过4K,很多浏览器限制一个站点最多20个,所有cookie最多300个 无限制
会话机制 服务端创建并通过响应返回给客户端,客户端存储,在下一次访问服务端的时候,请求携带发送给服务器 使用类似于哈希表的结构保存信息

参考文章:
Java Web(三) 会话机制,Cookie和Session详解
session机制详解以及session的相关应用

猜你喜欢

转载自blog.csdn.net/qq_39513105/article/details/89054859