当前位置: 首页 > 科技观察

熬夜吃透CookieSessionTokenJWT

时间:2023-03-18 23:11:25 科技观察

本文转载请联系LoveSmile的架构师公众号。一切的根源是因为HTTP是一种无状态协议。HTTP是一种无状态协议。什么是无国籍?也就是说,这个请求和之前的请求没有任何关系,互不认识,没有关联。看过电影的朋友一定记得夏洛特和大叔的一段对话:夏洛特:大叔,马冬梅家在322楼上吗?大叔:马东什么?夏洛特:马冬梅。大叔:什么冬梅?夏洛特:马冬梅。叔叔:这是什么李子?夏洛特:……好的,叔叔,你先冷静一下。“中断”大叔记不住马冬梅,就像HTTP协议记不住上次请求一样。说白了:HTTP的记忆力不太好,需要“助听器”。记忆力差的优点,就一个“快”字;缺点也很明显,需要依赖cookie、session、token等机制来关联客户端的多个请求。想象一下,如果没有cookie、session、token等机制,我们每次点击网站都需要重新输入密码认证。这么差的体验还要继续使用吗?在解释cookie、session、token之前,先简单解释一下两个概念:认证和授权。什么是认证?认证(Authentication)简单的说就是验证当前人的身份,证明你就是你自己。最常见的认证方式是通过用户名和密码,此外还有:通过用户手机:手机短信、手机二维码扫描、手势密码、用户邮箱、基于时间序列的身份证号和用户相关的一个-timepassword用户的生物特征:指纹、声音、眼睛虹膜等。为了确认用户身份,防止请求伪造,在对安全性要求高的场合,常采用组合认证(也叫多因素认证),即也就是同时采用多重认证的方式来验证用户的身份。什么是授权?授权简单来说就是授予第三方访问用户资源的权利。在互联网应用开发中,授权主要通过以下几种方式实现:通过session机制,访问会话维护用户的授权信息通过cookie机制,网站的cookie维护用户的授权信息,颁发授权令牌(token),A合法有效的令牌保存用户的授权信息。什么是饼干?cookie的特点cookie最初是为了弥补HTTP中状态管理的不足而设计的。Cookie存储在客户端:Cookie是服务器发送给用户浏览器并存储在本地的一小段数据。下次浏览器再次向同一服务器发出请求时,它会被携带并发送给服务器。Cookies不跨域:每个cookies都绑定到一个域名(包括子域名),不能在其他域名下使用。设置cookie服务器通过HTTP响应消息将cookie发送给客户端。在Set-Cookie中设置需要发送给客户端的cookie。cookie格式如下:Set-Cookie:value[;expires=date][;domain=domain][;path=path][;secure]cookie工作流程(1)浏览器向服务器发送请求;(2)服务器响应请求,设置cookie给浏览器;(3)浏览器将cookie保存在本地,下次Request时带上cookie;(4)服务器响应请求。cookie的常用属性(1)name=value键值对,设置cookie的名称和对应的值。(2)domain指定cookie所属的域名,默认为当前域名。如果cookie的域设置为taobao.com,那么item.taobao.com和order.taobao.com可以共享cookie,但是访问tmall.com不能共享cookie,这就涉及到跨域访问的问题。如何解决domain问题这里就不展开了。感兴趣的可以自行搜索。(3)path指定cookie生效的路径(路由),默认为'/'。如果设置为/abc,则只有/abc下的路由才能访问cookie,如:/abc/read。(4)expires指定cookie的过期时间(GMT时间格式),到达这个时间点后cookie会自动过期。(5)HTTP1.1定义的max-age比expires字段有更高的优先级。max-age表示cookie的有效期,单位秒。如果为正数,cookie将在max-age秒后过期;如果为负数,则该cookie为临时cookie,关闭浏览器即失效,浏览器不会以任何形式保存该cookie;如果为0,则表示删除cookie。默认为-1。(6)HttpOnly如果为某个cookie设置了httpOnly属性,则无法通过JS脚本读写该cookie的信息。(7)securecookie是否只使用安全协议传输,默认为false。当secure值为true时,cookie在HTTP中无效。什么是会话?session的翻译是“会话”。用户打开浏览器,单击多个超链接,访问服务器上的多个Web资源,然后关闭浏览器。整个过程称为一个会话。(1)session的特点Session是另一种记录服务器与客户端会话状态的机制;session保存在服务器端,一般是文件,或者是数据库或者缓存。Session一般是基于cookie来实现的。session中包含的敏感信息保存在服务器端,sessionId通常保存在客户端的cookie中,客户端每次请求时携带sessionId即可识别用户。(2)Session工作流程(1)用户首先请求,提交用户名密码等信息进行登录认证,服务器根据用户提交的信息进行认证,认证成功后创建session对象,插入sessionId存入cookie,浏览器收到响应信息,将cookie保存到本地;(2)用户第二次请求,以查看订单信息为例,浏览器自动将当前域名下的cookie信息发送给服务器,服务器解析cookie获取到达后找到对应的session对象会话标识。如果session对象存在,说明用户已经登录,进入下一步。从上面的过程可以看出,sessionId是cookie和session之间的桥梁。注意:如果客户端禁用cookies,也可以通过url重写等方式传递sessionId。cookie和session的区别存储方式:cookie数据存储在客户的浏览器上,session数据存储在服务器上;安全性:cookie保存在本地,不太安全,其他人可以通过分析保存在本地的cookie进行作弊;存储大小:很多浏览器限制单个cookie保存的数据不超过4K,一个站点最多可以保存20个cookie。会话没有类似的限制;关闭会话将使它失效。什么是令牌?(1)令牌的组成部分是用于验证用户身份的令牌,我们通常称之为:token。最简单的token组成:uid(用户的唯一标识),time(当前时间的时间戳),sign(签名,通过hash算法压缩成一定长度的十六进制字符串)(2)token特性无状态,可扩展支持移动设备支持跨程序调用安全(三)Token工作流程第一步:客户端请求使用用户名、密码或扫码登录;第二步:服务端收到请求后进行鉴权鉴权成功后,服务端会生成一个token发送给客户端。客户端收到token后,会进行存储,比如放在cookie或者localStorage中;第三步:客户端下次向服务端发送token请求资源时,需要带上存储的token;第四步:服务端收到请求,然后验证客户端请求中包含的token。如果验证成功,则将请求的数据返回给客户端。注意:客户端请求时,token可以放在HTTPHeader中;基于token的用户认证是一种无状态的服务器端认证方式,服务器端不需要存储token数据。用解析token的计算时间换取session的存储空间,从而减轻服务器的压力,减少数据库的频繁查询。什么是智威汤逊?(1)JWT是一种标准化的代币。从本质上讲,JWT也是一种代币,只是JWT是被广泛接受的标准。JWT,即:Jsonwebtoken(JWT),是一种基于JSON的开放标准(RFC7519),用于在Web应用程序环境之间传输声明。JWT的声明一般用于在身份提供者和服务提供者之间传递经过认证的用户身份信息,从而从资源服务器获取资源,也可以添加一些其他业务逻辑所需要的附加声明信息。(2)JWT的组成JWT由三部分组成:第一部分我们称之为头部(header)第二部分我们称之为负载(payload,类似于飞机上携带的物品)第三部分是签证(signature)在https://jwt.io/网站上可以解析出一个已知的JWT:headerjwt的header中携带了两部分信息:语句类型,这里是jwt;语句加密算法,一般直接使用HMACSHA256;有效负载负载是有用信息的存储位置。主要包括三部分:在标准中注册的声明;公开声明;私人声明。signaturejwt的第三部分是签名信息。这个签证信息由三部分组成:header(base64之后);有效载荷(在base64之后);秘密。(3)JWT的特点是jwt的payload部分不存储敏感信息,因为这部分是客户端可以解密的部分。保护秘密私钥,这非常重要。如果可能,请使用https协议。总结在分布式微服务技术越来越流行的今天,大型网站的设计尽量避免使用session来实现HTTP状态。会议简单粗暴。session信息在server端维护,sessionid保存在client端。服务器端可以很容易地将session控制在自己手中,但是服务的集群造成了session共享的负担;jwt(token)仅在客户端可用。保存session信息,服务器通过key对session进行校验,(相对于session)以时间换空间,减轻了服务器集群共享session信息的负担,同时也增加了服务器控制session的难度.