详解cookie 与 session

零碎知识点

  1. objhasOwnProperty(arg)方法:查找对象中是否含有arg属性。这个方法会查找一个对象是否有某个属性,但是不会去查找它的原型链。
  1. css3中的 calc()函数用于动态计算值
    ① 运算符前后都需要保留一个空格,例如:width:calc(100% - 10px)
    ② 任何长度值都可以使用calc函数进行计算
    calc()函数支持+-*/运算
    calc()函数使用标准的数学运算优先级规则。
    ⑤ 浏览器支持:
    在这里插入图片描述
  1. eval(string)函数可计算某个字符串(不一定是数值计算,也有可能是字符串拼接)并执行其中的js代码。
    ① 返回计算string得到的值(如果有的话)
    ② 该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回
    ③ 该方法可以将字符串函数转成真正的可执行的函数

一、 cookie详解

1. 说在前面

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

2. 基础概念

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

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

  • 内存Cookie由浏览器维护,保存在内存中,浏览器关闭后(并不是页面关闭,而是浏览器关闭)就消失了,其存在时间是短暂的。在服务端创建cookie但不指定过期时间时,默认是内存cookie
  • 硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。
  • 一般同一个域名的所有cookie存储在一起。所有的cookie存储在浏览器安装目录中。

3. 设置cookie 的变量详解

name

name:一个唯一确定的cookie名称。通常来讲cookie的名称是不区分大小写的。

value
  • 存储在当前cookie中的字符串值。最好为cookienamevalue进行url编码。当cookie的值中出现;,=以及空格等字符时,可使用escape()函数对其进行编码,而且使用此 种方案还可以避免中文乱码的出现。
  • 当使用escape()编码后,在取出值以后需要使用unescape()进行解码才能得到原来的cookie值。
domain
  • 代表cookie对哪个域有效。所有向该域发送的请求都会包含这个cookie信息。访问其子域时发送的请求也会包含这个cookie信息。
  • cookie可以允许在不同主机名但同域中共享,但是不允许跨域共享。
path
  • cookie影响到的路径。浏览器会根据这项配置,向指定域中的匹配的路径发送该cookie
  • 在请求页面时,只有访问了某一域下的该path或者访问了某一域下的该path的子path对应的页面时,才会在请求中包含该cookie
expires
  • 失效时间。表示cookie何时应该被删除的时间戳(也就是,何时应该停止向服务器发送这个cookie)。
  • 如果不设置这个时间戳,浏览器会在页面关闭时即将删除该cookie
  • 可以自己设置删除时间。这个值是GMT时间格式,如果客户端和服务器端时间不一致,使用expires就会存在偏差。
  • 如果设置的时间早于当前时间,则该cookie不会被存储。
max-age
  • expires作用相同,用来告诉浏览器此cookie多久过期(单位是秒)
  • 正常情况下,max-age的优先级高于expires
  • 若值为0,则是命令浏览器删除该cookie
HttpOnly
  • 告知浏览器不允许通过脚本document.cookie去更改这个值,同样这个值在document.cookie中也不可见。
  • 在http请求张仍然会携带这个cookie。注意这个值虽然在脚本中不可获取,但仍然在浏览器安装目录中以文件形式存在。这项设置通常在服务器端设置
secure
  • 安全标志。
  • 指定后,只有在使用SSL连接时才能发送到服务器。如果是http链接则不会传递该信息。
  • 设置了secure 属性也并不代表他人不能看到你机器本地保存的 cookie 信息,所以不要把重要信息存储在cookie

4. 工作原理

  • 创建cookie
    当用户第一次浏览某个使用cookie的网站时,该网站的服务器就进行如下工作
    ① 为该用户生成一个唯一的识别码cookie id,创建一个cookie对象
    ② 默认情况下它是一个会话级别的cookie,即内存cookie,用户退出浏览器之后被删除。如果网站希望浏览器将该cookie存储在磁盘上,需要设置最大时效max-age或者expired,并给出一个以秒为单位的时间(或者GMT时间),如果将最大时效设为0则是命令浏览器删除该cookie
    ③ 将cookie放到HTTP响应报头,将cookie插入到一个Set-CookieHTTP请求报头中
    ④ 发送该HTTP响应报文。

  • 设置存储cookie
    浏览器收到响应报文之后,根据报文头里的Set-Cookie的特殊指示,生成相应的Cookie并将其保存在客户端(磁盘/浏览器关闭消失)。该cookie里面记录着用户当前的信息。

  • 发送cookie
    当用户再次访问该网站时,浏览器首先检查所有cookie,找出所有满足条件的cookie(cookie的域名和path是当前网站的子域/当前域、子路径/当前路径),将找到的所有符合条件的cookie放入集合中并将其附在HTTP请求头上发送给服务器。

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

5. cookie的应用

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

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

6. cookie的缺陷

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

7. nodejs服务端使用cookie

① 查看Cookie

在NodeJS中可以通过req.headers.cookie访问到原始的cookie字符串(k1=v1;k2=v2;),在这个基础上对cookie进行组装和解析

② 修改/添加Cookie

  • 通过NodeJSres.setHeader()函数来重写cookie或增加cookie并返回给客户端,格式如下res.setHeader('Set-Cookie', ['key1=value1;path=/;...', 'key2=value2;path=/;...'])设置多个cookie
  • 可以使用res.setHeader('Set-Cookie', 'key1=value1;key2=value2'),通过一个字符串设置多条cookie的值,但是很多浏览器不支持这种方式,包括chrome)
  • express框架中,通过res.cookie(key,value[,options])添加的cookie实际上底层调用的是`res.setHeader(‘Set-Cookie’,[…,…])方法

③ 限制Cookie

  • 通过在Set-Cookie中设置expires,限制Cookie的过期时间;
  • 通过在Set-Cookie中设置path,限制Cookie的作用范围;
  • 通过在Set-Cookie中设置httpOnly,用来屏蔽在客户端通过Javascript访问和修改Cookie,从而提高系统安全性。
let http = require('http')

let app = http.createServer((req, res) => {
  // 服务器端读取cookie
  req.cookie = []
  let cookies = req.headers.cookie ? req.headers.cookie.split(';') : []
  if (cookies.length > 0) {
    cookies.forEach(item => {
      if (item) {
        let cookieArray = item.split('=')
        if (cookieArray && cookieArray.length > 0) {
          let key = cookieArray[0].trim()
          let value = cookieArray[1] ? cookieArray[1].trim() : undefined
          req.cookie[key] = value;//req的cookie属性值默认为[]
        }
      }
    })
  }
  // 服务器端设置cookie

  res.setHeader('Set-Cookie', [key1=value1;httpOnly;expires=${getExpireTime()}])

  res.end(
    JSON.stringify(req.cookie)
  )
})

app.listen(3000, () => {
  console.log('running on 3000')
})

function getExpireTime () {
  let d = new Date()
  d.setTime(d.getTime() + 15 * 60 * 1000)
  return d.toUTCString()
}

二、 session详解

1. 简介

  • Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。Session是一种服务器端的机制,Session 对象用来存储特定用户会话所需的信息
  • Session由服务端生成,保存在服务器的内存、缓存、硬盘或数据库中

2. 工作原理

  • 创建session
    ① 当用户访问到一个服务器,如果服务器启用Session,服务器就要为该用户创建一个Session。
    ② 在创建这个Session的时候,服务器首先检查这个用户发来的请求里是否包含了一个SessionID,如果包含了一个SessionID则说明之前该用户已经登陆过并为此用户创建过Session,那服务器就按照这个SessionID把这个Session在服务器的内存中查找出来(如果查找不到,就有可能为他新创建一个)
    ③ 如果客户端请求里不包含有SessionID,则为该客户端创建一个Session并生成一个与此Session相关的SessionID。这个SessionID是唯一的、不重复的、不容易找到规律的字符串,这个SessionID将被在本次响应中返回到客户端保存,而保存这个SessionID的正是COOKIE,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
  • 使用session
    在IE中,可以在工具的Internet选项中把Cookie禁止,如果把客户端的Cookie禁止了,那么就要有其他机制在COOKIE被禁止时仍然能够把SessionID传递回服务器。
    把SessionID直接附加在URL路径的后面http://…./xxx;jSession=....
    作为查询字符串附加在URL后面(类似传参写法http://…../xxx?jSession=...

作用

在服务端存储用户和服务器会话的一些信息

三、 cookiesession的区别

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属性eg:将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均能够访问该Cookie

② session不支持跨域名访问,只在其所在域名下有效。

7. 存储数据大小不同

① 一个cookie可最多可存储4k的数据
② 一个session可存储的数据的大小与服务器内存大小有关,服务器内存大小越大,一个session可存储的数据越多

参考文章:https://www.cnblogs.com/isme-zjh/p/11359557.html
https://blog.csdn.net/xml757688123/article/details/79397185

发布了90 篇原创文章 · 获赞 95 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43314846/article/details/104400725