Cookie和Session的区别
1、认证(Authentication)和授权(Authorization)的概念引入
可以这样简单理解:
- 认证:你是谁
- 授权:你有什么权限、能干什么
官方解释是这样的:
- 认证:是验证你的身份的凭据(例如用户名/用户 ID 和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。
- 授权: 发生在 认证 之后。授权,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如 admin,有些对系统资源操作比如删除、添加、更新只能特定人能操作。
实际开发中,我们都是将认证和授权结合在一起使用,目的就是保护我们系统的安全性!
2、什么是Cookie?
Cookie,即“小甜饼”的意思,在计算机领域中,特指一种由服务器发送到用户浏览器并保存在用户计算机上的小型文本文件。这个文件可以被服务器用来识别用户身份、跟踪用户活动、保存用户设置等。它通常由名称、值、域名、路径、过期时间等字段组成
如图为CSDN服务器返回给我的Cookie
3、Cookie有什么作用?
1)会话管理
Cookie最初也是最主要的作用就是用于会话管理。当用户登录一个网站时,服务器会生成一个包含Session ID的Cookie并发送给浏览器,浏览器将这个Cookie保存在本地。此后,每次用户发送请求时,浏览器都会自动将这个Cookie发送给服务器,服务器通过Session ID识别用户身份,从而保持用户的登录状态。【自动登录的原理,本地浏览器保存了Cookie,我们打开网站时,保存的Cookie被发送到服务器】
2)个性化设置
Cookie还可以用来保存用户的个性化设置,如主题、语言、字体大小等。这样,当用户再次访问网站时,网站可以根据Cookie中的信息为用户提供更加个性化的体验。
3)购物车功能
在电子商务网站中,Cookie经常被用来实现购物车功能。当用户将商品添加到购物车时,这些信息会被保存在Cookie中。这样,即使用户关闭了浏览器或换了一台电脑,只要Cookie还在,购物车中的商品信息就不会丢失。
4)跟踪用户行为
网站可以使用Cookie跟踪用户在网站上的行为,如访问了哪些页面、停留了多长时间、点击了哪些链接等。这些数据对于网站优化、广告投放等都非常有价值。
5)第三方Cookie与广告定向
除了网站自己设置的Cookie外,还有一些第三方Cookie,它们通常由广告商或数据分析公司设置。这些Cookie可以用来跟踪用户在多个网站上的行为,从而为用户提供更加精准的广告定向服务。然而,这种跨站跟踪的行为也引发了关于隐私保护的争议。
4、Cookie的类型
- 会话Cookie(Session Cookies):这种类型的Cookie在浏览器关闭后就会被删除,主要用于保存用户的会话信息。由于它们不会在用户的计算机上长期保存,因此相对较为安全。
- 持久Cookie(Persistent Cookies):与会话Cookie不同,持久Cookie会在用户的计算机上长期保存,直到其过期时间到达或被用户手动删除。这种类型的Cookie常用于保存用户的登录状态、个性化设置等信息。
- 安全Cookie(Secure Cookies):安全Cookie只能通过HTTPS协议传输,不能通过未加密的HTTP协议传输。这增加了Cookie在传输过程中的安全性。
- HttpOnly Cookie:HttpOnly是一个标志属性,用于防止JavaScript代码访问特定的Cookie。当设置了HttpOnly属性的Cookie被创建后,它将无法通过客户端脚本(如JavaScript)进行访问。这有助于减少跨站脚本攻击(XSS)的风险。
5、Session是什么?
Session(会话)是一种在网络应用中用于保存用户状态和信息的机制。它允许服务器在一段时间内保持关于用户的交互信息,从而实现用户在不同页面之间的数据共享和用户身份的保持,恰恰和Cookie相反。
6、Session的工作原理
- 创建Session:
当用户第一次访问服务器时,服务器创建一个新的Session,并生成一个唯一的Session ID。这个Session ID通常是一个长字符串,用于唯一标识这个会话。 - 存储Session数据:
服务器将需要保存的数据(如用户信息、购物车内容等)存储在服务器端的Session对象中。Session数据通常保存在服务器的内存中,也可以存储在文件系统、数据库或分布式缓存中(如Redis)。 - Session ID的传递:
服务器将生成的Session ID发送给客户端,通常通过HTTP响应的Cookie头部发送。客户端(如浏览器)会将这个Cookie保存下来,并在后续请求中将其发送回服务器。 - Session验证:
当客户端再次发送请求时,会带上之前保存的Session ID(通过Cookie)。服务器接收到请求后,通过Session ID查找对应的会话数据,验证用户身份,并根据需要进行相应处理。 - 销毁Session:
当用户登出或会话超时时,服务器会销毁对应的Session,删除存储的数据。会话超时是为了防止长期不活动的会话占用服务器资源,通常可以配置超时时间。
7、Cookie和Session有什么区别?
- 存储位置:Session数据存储在服务器端,Cookie数据存储在客户端(浏览器)中;
- 安全性:Session会更安全,因为数据存储在服务器端,不容易被客户端篡改。
- 数据大小:Session可以存储较多数据,受限于服务器存储能力。Cookie数据受限于客户端浏览器,一般大小不能超过4KB。
- 生命周期:Session一般在用户关闭浏览器或会话超时后失效,而Cookie可以设置过期时间,长时间保存。
8、为什么Cookie无法防止CSRF攻击,而Token可以?
1)什么是CSRF攻击?
CSRF(Cross Site Request Forgery) 一般被翻译为 跨站请求伪造 。那么什么是 跨站请求伪造 呢?
说简单点,就是用你的身份去发送一些对你不友好的请求。举个简单的例子:
小壮登录了某网上银行,他来到了网上银行的帖子区,看到一个帖子下面有一个链接写着“科学理财,年盈利率过万”,小壮好奇的点开了这个链接,结果发现自己的账户少了 10000 元。这是这么回事呢?原来黑客在链接中藏了一个请求,这个请求直接利用小壮的身份(Cookie) 给银行发送了一个转账请求,也就是通过你的 Cookie 向银行发出请求。
<a src=http://www.mybank.com/Transfer?bankId=11&money=10000>科学理财,年盈利率过万</>
2)什么是Token?
Token(令牌)是一种用于身份验证和授权的数字标识符。在计算机系统和网络应用中,Token常用于替代传统的会话管理方式(如Session),为用户的身份验证提供一种安全、灵活和分布式的解决方案。
3)Token可以防止CSRF攻击的原理:
1. CSRF攻击时攻击者是无法直接窃取到用户的信息(Cookie,Header,网站内容等),仅仅是冒用Cookie中的信息;
2. 我们通过要求所有用户请求都携带一个CSRF攻击者无法获取到的Token,服务器通过校验请求是否携带正确的Token,来防止CSRF的攻击。
3. Token防护的三个步骤:
- 将Token输出到HTML页面的请求中:
首先,用户打开页面的时候,服务器需要给这个用户生成一个Token,该Token通过加密算法对数据进行加密,一般Token都包括随机字符串和时间戳的组合,显然在提交时Token不能再放在Cookie中了,否则又会被攻击者冒用。因此,为了安全起见Token最好还是存在服务器的Session中,之后在每次页面加载时,使用JS遍历整个DOM树,对于DOM中所有的a和form标签后加入Token。这样可以解决大部分的请求,但是对于在页面加载之后动态生成的HTML代码,这种方法就没有作用,还需要程序员在编码时手动添加Token - 页面提交的请求携带这个Token:
对于GET请求,Token将附在请求地址之后;而对于POST请求,则要在form的最后加上:
<input type=”hidden” name=”csrftoken” value=”tokenvalue”/>
这样Token就以参数的形式加入请求了。
3. 服务器验证Token是否正确
当用户从客户端得到了Token,再次提交给服务器的时候,服务器需要判断Token的有效性,验证过程是先解密Token,对比加密字符串以及时间戳,如果加密字符串一致且时间未过期,那么这个Token就是有效的。Token可以在产生并放于Session之中,然后在每次请求时把Token从Session中拿出,与请求中的Token进行比对,但这种方法的比较麻烦的在于如何把Token以参数的形式加入请求。