COOKIE和SESSION的原理和区别

目录

1. COOKIE

1.1 什么是Cookie?

1.2 Cookie的工作原理

1.3 cookie属性介绍

1.3.1 cookie属性项

1.3.2 Expires

1.3.3 修改或者删除Cookie

1.3.4 Cookie的域名

1.3.5 Cookie的路径

1.3.6 Cookie的安全属性

1.4 cookie规范

1.5cookie 常用函数

2. SESSION

2.1 什么是SESSION?

2.2 函数

3 COOKIE和SESSION的区别和联系

3.1 COOKIE和SESSION的区别

1、定义与用途

2、存储位置与数据大小

3、生命周期与有效期

4、数据类型与安全性

5、使用场景与优缺点


1. COOKIE

1.1 什么是Cookie?

Cookie 是一些数据, 存储于你电脑上的文本文件中。 当 web服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息。 Cookie 的作用就是用于解决 "如何记录客户端的用户信息": 当用户访问 web 页面时,他的名字可以记录在 cookie 中。 在用户下一次访问该页面时,可以在 cookie 中读取用户访问记录。 Cookie 以名/值对形式存储,如下所示:

username=Tom

当浏览器从服务器上请求 web 页面时, 属于该页面的 cookie 会被添加到该请求中。服务端通过这种方式来获取用户的信息。 打个比方,我们去银行办理储蓄业务,第一次给你办了张银行卡,里面存放了身份证、密码、手机等个人信息。当你下次再来这个银行时,银行机器能识别你的卡,从而能够直接办理业务。

1.2 Cookie的工作原理

当用户第一次访问并登陆一个网站的时候,cookie的设置以及发送会经历以下4个步骤: (1)客户端发送一个请求到服务器 (2)服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部 (3)客户端保存cookie,之后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部 (4)服务器返回响应数据

img

1.3 cookie属性介绍
1.3.1 cookie属性项
属性项属性项介绍
NAME=VALUE键值对,可以设置要保存的 Key/Value,注意这里的 NAME 不能和其他属性项的名字一样
Expires过期时间,在设置的某个时间点后该 Cookie 就会失效
Domain生成该 Cookie 的域名,如 domain="www.baidu.com"
Path该 Cookie 是在当前的哪个路径下生成的,如 path=/wp-admin/
Secure如果设置了这个属性,那么只会在 HTTPS/SSL连接时才会回传该 Cookie
1.3.2 Expires

该属性用来设置Cookie的有效期。Cookie中的maxAge用来表示该属性,单位为秒。Cookie中通过getMaxAge()和setMaxAge(int maxAge)来读写该属性。maxAge有3种值,分别为正数,负数和0。那maxAge的这3种值分别代表了什么呢?

  1. maxAge为正数:

    • 表示该Cookie会在maxAge秒之后自动失效。

    • 浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。

    • 无论用户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。

  2. maxAge为负数:

    • 表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效。

    • 关闭窗口后,该Cookie即失效。

    • maxAge为负数的Cookie是临时性Cookie,不会被持久化,不会被写到Cookie文件中。

    • Cookie信息保存在浏览器内存中,因此关闭浏览器后,该Cookie就会消失。

    • 值得注意的是,Cookie默认的maxAge值为-1。

  3. maxAge为0:

    • 表示删除该Cookie。

    • 由于Cookie机制没有提供直接的删除Cookie的方法,因此通过设置该Cookie即时失效(即maxAge为0)来实现删除Cookie的效果。

    • 失效的Cookie会被浏览器从Cookie文件或者内存中删除。

1.3.3 修改或者删除Cookie

修改Cookie

  1. 通过服务器端代码修改:

    • 在服务器端,可以通过检索用户当前会话中的Cookie,然后修改其值或属性(如maxAge),最后将修改后的Cookie重新发送到客户端。

    • 例如,在Java Web应用中,可以通过HttpServletRequest对象的getCookies()方法获取所有Cookie,找到需要修改的Cookie后,使用setValue()setMaxAge()等方法修改其值和有效期,然后通过HttpServletResponse对象的addCookie()方法将修改后的Cookie发送回客户端。

  2. 通过客户端JavaScript修改:

    • 在客户端,可以使用JavaScript来修改Cookie。不过,这种方法通常只适用于修改Cookie的值,而无法直接修改其属性(如pathdomain等)。

    • 要修改Cookie的值,可以设置一个与要修改的Cookie同名的新Cookie,并指定新的值。由于Cookie的作用域规则,这个新Cookie会覆盖原有的Cookie。

    • 例如,使用document.cookie属性来设置或修改Cookie:document.cookie = 'key=newValue; path=/';。这里,key是Cookie的名称,newValue是新的值,path=/指定了Cookie的作用域路径。

删除Cookie

  1. 通过服务器端代码删除:

    • 服务器端删除Cookie的方法与修改Cookie类似,但关键是将Cookie的maxAge属性设置为0(或者一个负值,但0是更标准的做法),然后重新发送到客户端。这样,客户端浏览器就会将Cookie视为已过期并删除它。

    • 例如,在Java Web应用中,可以创建一个与要删除的Cookie同名的新Cookie,将其值设置为空字符串(虽然不是必需的),将maxAge设置为0,然后发送到客户端。

  2. 通过客户端JavaScript删除:

    • 客户端JavaScript删除Cookie的方法与修改Cookie的值类似,但关键是将Cookie的expires属性设置为一个过去的日期(或者将maxAge设置为一个负值,但这种方法不是所有浏览器都支持),从而触发浏览器的删除机制。

    • 然而,更标准的做法是使用maxAge=0来删除Cookie,但由于JavaScript中直接设置maxAge属性并不总是有效(因为document.cookie的语法不支持直接设置属性),因此通常的做法是设置expires为一个过去的日期。

    • 例如:document.cookie = 'key=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/';。这里,key是Cookie的名称,expires被设置为一个遥远的过去日期,从而触发删除机制。

  3. 通过浏览器设置删除:

    • 大多数现代浏览器都提供了清除Cookie的选项。用户可以通过浏览器的设置或隐私选项来查找和删除特定的Cookie或清除所有Cookie。

    • 例如,在Chrome浏览器中,可以通过打开设置(Settings),然后导航到“隐私设置和安全性”(Privacy Settings and Security),再找到“Cookie和其他站点数据”(Cookies and other site data)来查看和删除Cookie。

1.3.4 Cookie的域名

Cookie是不可以跨域名的,隐私安全机制禁止网站非法获取其他网站的Cookie。

由于浏览器的同源策略,不同二级域名的网页之间默认是无法共享Cookie的。但是,如果它们的一级域名相同,可以通过将它们的document.domain属性设置为相同的一级域名来放宽这一限制,从而实现Cookie的共享。

一级域名是互联网域名系统(DNS)中的最高级别域名分类,也被称为顶级域名。它通常表示特定的国家、地区、组织或类型。熟悉的一级域名有baidu.com,qq.com。com,cn,net等均是常见的后缀。 二级域名是顶级域名下的一个具体名称,位于“http://www.”之后和主域名之前的部分。例如,在网址“https://tech.example.com”中,“tech”就是二级域名,“example.com”是主域名或顶级域名。

1.3.5 Cookie的路径

path属性决定允许访问Cookie的路径。在创建Cookie时,如果没有显式设置path属性,则大多数浏览器会将其默认为当前请求的URL的路径。这意味着,只有来自相同路径的请求才能访问该Cookie。

匹配规则:

  1. 精确匹配:如果Cookie的path属性设置为一个具体的路径(例如/path/to/resource),则只有当请求的URL的路径与该路径完全匹配时,Cookie才会被发送。(设置为"/"表示允许所有路径都可以使用Cookie)

  2. 前缀匹配:更常见的是,Cookie的path属性设置为一个目录路径(例如/path/),此时,该目录及其所有子目录下的URL都可以访问该Cookie。也就是说,如果请求的URL的路径以Cookie的path属性为前缀,那么该Cookie就会被发送。

1.3.6 Cookie的安全属性
  1. Secure属性 定义:Secure属性是一个布尔值,用于指定Cookie是否应通过HTTPS协议传输。 功能:当Secure属性设置为true时,Cookie仅能通过HTTPS连接发送至服务器,而不能通过不安全的HTTP协议发送。这有助于防止中间人攻击,确保Cookie在传输过程中的安全性。(设置secure属性不会将Cookie的内容加密,如果想保证安全,最好使用md5算法加密。) 应用:在需要保护敏感信息(如用户会话、身份验证令牌等)的场景中,应使用Secure属性。

  2. HttpOnly属性 定义:HttpOnly属性也是一个布尔值,用于限制客户端脚本(如JavaScript)对Cookie的访问。 功能:当设置了HttpOnly属性的Cookie被创建后,它将无法通过客户端脚本进行访问。这有助于减少跨站脚本攻击(XSS)的风险,因为攻击者无法通过JavaScript读取设置了HttpOnly属性的Cookie。 应用:为了防止XSS攻击,所有包含敏感信息的Cookie都应设置HttpOnly属性。

  3. SameSite属性 定义:SameSite属性用于限制Cookie的跨站点请求访问。 功能:SameSite属性可以设置为Strict、Lax或None,以控制Cookie在不同情况下的发送行为。 Strict:在任何跨站点请求中都不会发送Cookie。 Lax:在大多数跨站点请求中不发送Cookie,但导航到目标站点的GET请求除外(例如,通过链接点击或表单提交)。 None:允许跨站点请求发送Cookie,但必须同时设置Secure属性(即,只能通过HTTPS发送)。 应用:SameSite属性有助于防止跨站请求伪造(CSRF)攻击,并增强Cookie的安全性。

1.4 cookie规范
  • Cookie大小上限为4KB;

  • 一个服务器最多在客户端浏览器上保存20个Cookie;

  • 一个浏览器最多保存300个Cookie

上面的数据是HTTP对Cookie的规范,但是现在一些浏览器可能会对Cookie规范 做了一些扩展,例如每个Cookie的大小为8KB,最多可保存500个Cookie等 不同的浏览器之间是不共享Cookie的

1.5cookie 常用函数
  //用于在其响应头中增加一个相应的Set-Cookie头字段
   addCookie
   
   //用于获取客户端提交的Cookie
   GetCookie
   public Cookie(String name,String value)
       
   //该方法设置与 cookie 关联的值。
   setValue
   
   //该方法获取与 cookie 关联的值。
   getValue
   
   //该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie只会在当前 session 会话中持续有效。
   setMaxAge
   
   //该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭
   getMaxAge
   
   //该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。
   setPath
   
   //该方法获取 cookie 适用的路径。
   getPath
   
   //该方法设置 cookie 适用的域
   setDomain
   
   //该方法获取 cookie 适用的域
   getDomain

2. SESSION

2.1 什么是SESSION?

Session是另一种记录浏览器状态的机制,Cookie保存在浏览器中,Session保存在服务器中。用户使用浏览器访问服务器的时候,服务把用户的信息,以某种形式记录在服务器,这就是Session。

为何使用Session?因为Session可以存储对象,可以解决很多Cookie解决不了的问题,而Cookie只能存储字符串。

2.2 函数

Session有着request和ServletContext类似的方法。其实Session也是一个域对象。Session作为一种记录浏览器状态的机制,只要Session对象没有被销毁,Servlet之间就可以通过Session对象实现通讯。

   //获取Session被创建时间
   long getCreationTime()
   
   //获取Session的id
   String getId()
   
   //返回Session最后活跃的时间
   long getLastAccessedTime()
   
   //获取ServletContext对象
   ServletContext getServletContext()
   
   //设置Session超时时间
   void setMaxInactiveInterval(int var1)
   
   //获取Session超时时间
   int getMaxInactiveInterval()
   
   //获取Session属性
   Object getAttribute(String var1)
   
   //获取Session所有的属性名
   Enumeration getAttributeNames()
   
   //设置Session属性
   void setAttribute(String var1, Object var2)
   
   //移除Session属性
   void removeAttribute(String var1)
   
   //销毁该Session
   void invalidate()
   
   //该Session是否为新的
   boolean isNew()

3 COOKIE和SESSION的区别和联系

3.1 COOKIE和SESSION的区别
1、定义与用途
  1. COOKIE

    • 定义:COOKIE是服务器发送到客户端(浏览器)并保存在本地的一小块数据,它会在浏览器下次向同一服务器再次发起请求时被携带并发送到服务器上。

    • 用途:主要用于记录用户的一些基本信息,如登录状态、购物车内容、个性化设置等,以便服务器能够识别用户身份并据此提供相应的服务。

  2. SESSION

    • 定义:SESSION是指服务器和客户端之间建立的一种临时的、独立的通信连接,用于跟踪用户在网站上的活动和交互。

    • 用途:主要用于保存用户的会话信息,如登录信息、操作记录等,以便在多个页面之间共享数据,从而保持用户状态的一致性。

2、存储位置与数据大小
  1. 存储位置

    • COOKIE:存储在客户端(浏览器)上,不占用服务器资源。

    • SESSION:存储在服务器端,由服务器负责管理。

  2. 数据大小

    • COOKIE:由于存储在客户端,其大小受到浏览器和操作系统的限制,通常不超过4KB(不同浏览器和网站可能有所不同)。

    • SESSION:存储在服务器端,理论上没有大小限制,但受限于服务器的存储能力和性能。

3、生命周期与有效期
  1. COOKIE

    • 生命周期:COOKIE有一个有效期,可以设置过期时间。当超过有效期时,COOKIE会自动失效。

    • 有效期管理:可以通过设置Expires头部或Max-Age属性来指定COOKIE的过期时间。

  2. SESSION

    • 生命周期:SESSION的生命周期是临时的,通常与用户的会话(Session)相关联。当用户关闭浏览器或会话结束时,SESSION会自动失效。

    • 会话管理:服务器通过SESSION ID来识别和管理用户的会话。SESSION ID通常存储在COOKIE中或通过URL参数传递。

4、数据类型与安全性
  1. 数据类型

    • COOKIE:只能存储字符串类型的数据。如果需要存储复杂数据类型,需要进行序列化和反序列化操作。

    • SESSION:可以存储任意类型的数据,包括对象、数组等复杂数据结构。

  2. 安全性

    • COOKIE:由于存储在客户端,容易被恶意程序窃取或篡改。因此,存储敏感信息时需要进行加密处理。

    • SESSION:存储在服务器端,相对更安全。但也需要通过加密和签名等措施来保护SESSION ID的安全。

5、使用场景与优缺点
  1. 使用场景

    • COOKIE:适用于需要在客户端存储少量用户信息并跨页面共享的场景。

    • SESSION:适用于需要在服务器端保存用户会话信息并跨页面共享的场景。

  2. 优缺点

    • COOKIE

      • 优点:不占用服务器资源;可以跨页面共享用户信息。

      • 缺点:安全性较低;数据大小受限;容易被恶意程序窃取或篡改。

    • SESSION

      • 优点:安全性相对较高;可以存储任意类型的数据;易于管理用户会话。

      • 缺点:占用服务器资源;需要服务器支持会话管理功能;如果用户关闭浏览器或会话结束,SESSION会自动失效(这有时可能是一个缺点,取决于具体应用场景)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值