cookie、session、tokencookie、session生成的后台HTTP是无状态协议。为了跟踪会话,服务器和浏览器必须主动维护一个状态。该状态用于通知服务器前后两次请求是否来自同一个浏览器。而这个状态需要通过cookie或者session来实现。Cookie实现机制Cookie由HTTP服务器设置并存储在浏览器中。服务器通过Set-Cookie响应头域通知浏览器保存Cookie,浏览器通过Cookie请求头域告诉服务器之前的状态。一个cookie包含若干个键值对,每个键值对都可以设置一个过期时间。Cookie不跨域。cookie属性描述name=value键值对的重要属性,设置cookie的名称和对应的值,必须是字符串类型如果值是Unicode字符,需要是字符编码。如果该值是二进制数据,则需要使用BASE64进行编码。domain指定cookie所属的域名,默认为当前域名path指定cookie生效的路径(路由),默认为'/'。如果设置为/abc,则只有/abc下的路由才能访问cookie,如:/abc/read。maxAgecookie过期时间,以秒为单位。如果是整数,则cookie在maxAge秒后过期。如果为负数,则该cookie为临时cookie,关闭浏览器即失效,浏览器不会以任何形式保存该cookie。如果为0,表示删除cookie。默认为-1。总比过期好。expires过期时间,cookie会在设置的某个时间点后失效。通常,默认情况下会存储浏览器cookie。当浏览器关闭结束会话时,cookie也会被删除。securecookie是否仅使用安全协议传输。安全协议包括HTTPS、SSL等,数据在网络上传输之前被加密。默认为假。当secure值为true时,cookie在HTTP中无效,在HTTPS中有效。httpOnly如果为cookie设置了httpOnly属性,则无法通过JS脚本读取cookie信息,但是仍然可以通过Application手动修改cookie,所以只能在一定程度上防止XSS攻击,并不是绝对安全的SameSite可以防止跨站请求时发送Cookie,从而防止跨站请求伪造攻击(CSRF)。SameSiteSameSite可以有以下三个值:Strict只允许一方请求携带cookies,即浏览器只会对同一个站点请求发送cookies,即当前网页的URL与请求的目标URL。Lax允许一些第三方请求携带CookieNone,不管是否会跨站发送cookies,之前默认为None,Chrome80之后默认为Lax。接下来我们看看从None改成Lax对Cookies的发送有什么影响?直接来一张图:有两点需要注意:HTTP接口不支持SameSite=none。如果要添加SameSite=none属性,那么Cookie必须同时添加Secure属性,也就是说Cookie只会在HTTPS协议下使用。已发送。需要UA检测,部分浏览器无法添加SameSite=none。iOS12Safari和一些旧版本的Chrome会将SameSite=none识别为SameSite=Strict,因此服务器在发送Set-Cookie响应头时必须进行User-Agent检测。对于那些不发出SameSite=none属性cookie的浏览器,存在安全风险。HTTP客户端软件(包括curl、Node.js)可以发送任意HTTP请求并设置任意头部字段。Cookie可以被篡改!cookie以明文形式传输。session存储位置:session是基于cookie实现的,session存储在服务器端,sessionId会存储在客户端的cookie中。Session可以保存在HTTP服务器的内存中,也可以保存在内存数据库中(如redis),对于重量级应用甚至可以保存在数据库中。认证过程cookie和session安全性的区别:Session比Cookie安全,Session保存在服务器端,Cookie保存在客户端。访问值的类型不同:Cookie只支持存储字符串数据,而Session可以存储任何数据类型。有效期不同:Cookies可以设置长期保存,而Session一般有一个较短的过期时间,在客户端关闭(默认)或Session超时时过期。存储大小不同:单个cookie保存的数据不能超过4K,session可以存储的数据比cookie多很多,但是当访问量过多时,会占用过多的服务器资源。Authentication,authorization,credentialauthentication:验证当前用户的身份。授权:授权第三方应用使用用户的某些资源。Credentials:用于标记访问者身份的证书token。访问资源接口(API)所需的资源凭据。JSONWebToken(JWT)是一种跨域身份验证方案。简单token的组成:uid(用户唯一标识)、time(当前时间的时间戳)、sign(签名)特点:服务器端无状态,扩展性好支持移动设备安全支持跨程序调用认证流程:token和session的区别Session可以记录session信息,Token不会存储session信息。安全性:Token安全性优于SessionwebStorage背景前提:使用cookies存储永久数据存在几个问题:1.大小:cookies的大小限制在4KB以内。2.带宽:Cookies是和HTTP事务一起发送的,所以发送cookies时使用的带宽有一部分会被浪费掉。3.复杂性:很难正确操作cookies。只有document.cookie='...'可以用来修改这些问题。在HTML5中,又提供了一个在客户端本地保存数据的功能,这就是WebStorage。这是HTML5中的新功能。使用它可以在客户端本地建立数据库,减轻了服务器端的负担,加快了数据的访问速度。WebStorage提供了两个API:localStorage(本地存储)和sessionStorage(会话存储)。localStorage和sessionStorage的区别:适用范围:localStorage:只要在同源(协议+主机名+端口)下,就可以读取/修改同一个localStorage数据。sessionStorage:比localStorage更严格,除了协议、主机名、端口外,还要求在同一个窗口下(即浏览器的标签页)。生命周期:localStorage:存在于本地,永久存储。sessionStorage:只要浏览器关闭(包括浏览器标签页),它就会被清空。应用场景:localStorage:常用于长期登录(+判断用户是否登录),适用于本地数据的长期存储。sessionStorage:敏感账号一次性登录;相同:以下以localStorage为例。数据结构:是标准的键值对(Key-Value)数据类型,简单易扩展,只能存储字符串类型。对于复杂的对象,可以使用ECMAScript提供的JSON对象的stringify和parse进行处理。JSON.stringify()将其json对象转换为字符串。JSON.parse()将字符串转换为json对象格式。对于图片可以转换为DataUrl(base64)。存储大小:一般:5MB存储位置:全部存储在客户端,不与服务器进行交互通信。使用方法:写://写a字段localStorage["a"]='1';//写b字段localStorage.b='2';//写c字段localStorage.setItem("c",'3');//推荐获取:getItem(key)localStorage.getItem(key)删除:清空localStorage的所有内容:localStorage.clear()删除localStorage中的一个键值对:localStorage.removeItem(key);获取localStorage的key:key()方法,进入和退出index获取对应的keylocalStorage.setItem("a","re??d");localStorage.setItem("b","black");for(leti=0;i
