前言
首先我们得清楚cookie的定义是什么,Cookie(也称为HTTP Cookie、Web Cookie或浏览器Cookie)是一个小型的文本文件,由服务器发送到用户的浏览器,并保存在用户的计算机上。
工作原理
设置Cookie:当服务器需要记住关于用户的信息时,它会将Cookie作为HTTP响应的一部分发送到用户的浏览器。这个Cookie包含了服务器想要存储的信息,如用户ID、会话ID等。
存储Cookie:用户的浏览器接收到Cookie后,会将其存储在用户的计算机上。这通常是在用户的浏览器缓存或特定的Cookie文件夹中。
发送Cookie:当用户再次访问该网站时,浏览器会在HTTP请求中包含之前存储的Cookie,并将其发送到服务器。
读取Cookie:服务器接收到HTTP请求后,会解析其中的Cookie,并根据其中的信息来识别用户或执行其他操作。
当用户首次访问网站时,客户端(即用户的浏览器)是没有携带与该网站相关的Cookie的。在这种情况下,服务器会根据业务逻辑判断是否需要为用户设置一个或多个Cookie,并在HTTP响应的头部信息中添加Set-Cookie字段。这个字段包含了Cookie的名称、值以及其他可选属性,如过期时间、路径、域名和安全标志等。
sequenceDiagram
客户端->>服务端: http请求
服务端-->>客户端: cookie相关信息
客户端-)服务端: 携带cookie以及相关信息
cookie存在哪些不安全性
隐私泄露:Cookie可能包含用户的个人信息,如用户名、电子邮件地址等。如果这些Cookie被未经授权的人获取,就可能导致用户隐私泄露的风险。攻击者可以通过窃取Cookie来获取用户的身份信息,进而冒充用户或进行其他恶意活动。
跨站脚本攻击(XSS) :XSS是一种常见的Web安全漏洞,攻击者可以通过注入恶意脚本来获取用户的Cookie信息。当用户访问被注入恶意脚本的网页时,这些脚本可以窃取用户的Cookie,并发送给攻击者。攻击者获得Cookie后,就可以冒充用户或进行其他恶意操作。
跨站请求伪造(CSRF) :CSRF是一种利用用户在其他网站上的身份验证信息来执行非授权操作的攻击方式。攻击者可以通过伪造请求,诱使用户在另一个网站上执行某些操作,从而导致用户的Cookie被发送到攻击者的网站。攻击者获得Cookie后,就可以冒充用户进行非授权操作。
会话劫持:攻击者通过获取用户的会话ID或Cookie来冒充用户身份。一旦攻击者获得有效的会话ID或Cookie,就可以在不需要用户名和密码的情况下访问用户的账户,进行非法操作。
跨站点信息泄露(XSSI) :XSSI攻击是一种利用Web应用程序在返回响应时,可能会泄露敏感信息的漏洞。攻击者可以通过获取包含敏感信息的Cookie来获取用户的个人信息。
性能问题:Cookie会增加网络传输的数据量,特别是对于包含大量Cookie的网站,会增加页面加载时间和带宽消耗。
跨设备同步问题:由于Cookie是存储在特定设备上的,当用户在不同设备上访问同一网站时,可能无法同步其偏好设置和登录状态。
session认证工作原理
客户端请求:当用户通过浏览器访问网站时,浏览器会向服务器发送一个HTTP请求。
服务器创建Session:服务器接收到请求后,如果该请求没有携带有效的Session标识(如Session ID),服务器会为该用户创建一个新的Session。Session ID是一个唯一的标识符,用于标识用户的会话。
Session数据存储:服务器会将用户的会话信息(如登录状态、用户信息等)存储在服务器内存或持久化存储(如数据库)中。这些信息通常以键值对的形式存在,称之为session对象。
Session ID发送给客户端:服务器会在HTTP响应中通过Cookie或者URL参数的方式将Session ID发送给客户端。客户端浏览器会保存这个Session ID。
客户端请求携带Session ID:在后续的请求中,客户端会在HTTP请求中携带之前获得的Session ID。
服务器检索Session数据:当服务器接收到客户端的请求时,会根据请求中的Session ID来检索对应的Session数据。
Session数据使用:服务器可以根据Session数据来判断用户的登录状态、获取之前存储的用户信息等,然后根据业务逻辑处理请求。
sequenceDiagram
客户端->>服务端: http请求
服务端-->>客户端: cookieID以及seesionID,个人隐私信息存储在服务器中
客户端-)服务端: 携带cookieID以及seesionID
token认证工作原理
-
生成Token:
- 当用户首次登录成功之后,服务器端会生成一个token值。这个值通常是一个由服务端生成的一串字符串,作为客户端进行请求的一个令牌。
- 服务器会在本地(如数据库中)保存这个token值。
- 然后,服务器将这个token值返回给客户端。
-
客户端存储Token:
- 客户端接收到服务端返回的token后,会将其保存在本地。保存的位置可以是浏览器的localStorage、sessionStorage,也可以是应用程序的内存中,具体位置由服务器端设置。
-
客户端发送请求:
- 在后续的请求中(通常是非登录请求),客户端会将这个token值作为请求头(如
Authorization)或请求参数(如URL参数、POST请求的Body等)发送给服务器。
- 在后续的请求中(通常是非登录请求),客户端会将这个token值作为请求头(如
-
服务器验证Token:
- 服务器接收到客户端的请求后,会从请求头或请求参数中提取出token值。
- 然后,服务器会检查这个token值的合法性和有效期。这通常涉及到验证token的签名是否正确(以确保token没有被篡改)和token是否在预设的有效期范围内。
- 如果token验证通过,服务器会处理相应的请求,并向客户端返回所需的数据。
- 如果token验证不通过(如token已过期或被篡改),服务器可能会返回错误信息,并要求客户端重新登录或采取其他措施。
-
Token的优点:
- 无状态:基于token的身份验证是无状态的,服务端不需要存储session信息,因为token自身包含了所有登录用户的信息。
- 可重用性:token可以在多个平台和域上重复使用,方便构建与其他应用程序共享权限的应用程序。
- 安全性:由于不使用Cookies,Token机制不必再防御网站的跨站点请求伪造(CSRF)攻击。
-
安全措施:
- 为了保证token的安全性,客户端在存储token时需要采取安全措施,例如将其存储在安全的存储介质中,或使用加密技术来保护token的机密性。