1.Cookie 和 Session
http本身无状态,就是不保存任何用户信息。 所以引入cookie(客户端方案)、session(服务端方案)来保存用户信息
http 为什么无状态? 很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用记住是谁刚刚发了HTTP请求, 每个请求对我来说都是全新的。 但是随着交互式Web应用的兴起,像在线购物网站,需要登录的网站等等,马上就面临一个问题,那就是要管理会话,必须记住哪些人登录系统, 哪些人往自己的购物车中放商品, 也就是说我必须把每个人区分开,这就是一个不小的挑战,因为HTTP请求是无状态的,所以想出的办法就是给大家发一个会话标识(session id), 说白了就是一个随机的字串,每个人收到的都不一样, 每次大家向我发起HTTP请求的时候,把这个字符串给一并捎过来, 这样我就能区分开谁是谁了
1.1 区别
讲一下Cookie和Session? cookie因为保存在客户端存在: 安全问题(拦截或本地文件找到cookie,存在被篡改的风险) 大小的限制(一般不超过4kb) 只能存字符串
而session保存在服务器端: 使用的是map数据结构实现,通过 session.setAttribute(“key”,value) 存信息 和 session.getAttribute(“key”) 得到value。当用户已登录系统后你就在session中存储了一个用户信息对象,此后你可以随时从session中将这个对象取出来进行一些操作,比如进行身 份验证等等. 所以它可以保存各种类型的数据,大小也没有限制
注意: 1、但session不适合保存比较多的信息,防止服务端压力过大。一般只存ID,比如一个网站同时几万人访问,服务器端要保存这么多 session 对服务器来说压力很大 2、密码也不宜放进session。 private transient String password; 且分布式项目的缘故。
1.2 Cookie 和 session 的生命周期
Cookie 的生存周期? Cookie在生成时就会被指定一个Expire值,这就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。有些页面将Cookie的生存周期设置为“0”或负值,这样在关闭浏览器时,就马上清除Cookie,不会记录用户信息,更加安全。
session 的生命周期? 当浏览器第一次请求是,服务器端创建一个session对象,同时生成一个sessionId,并在此次响应中将sessionId 以响应报文的方式传回客户端浏览器内存或以重写url方式送回客户端,来保持整个会话。 当超时(30分钟没有进行任何HTTP请求)或者session.invalidate()将session设置为失效; 关闭浏览器不会删除服务端的session,但是可能会删除cookie保存的sessionId。
2.Token
了解 token 吗? token也是用来保持会话的,在客户端第一次登录后,服务器生成回给客户端,并由客户端保持,在之后的请求的时候带上 token 来表明身份
token 由用户信息和签名组成 签名: 服务端在接受到用户请求的时候判断该请求是否是来自于自己允许的平台(自己允许的平台有统一的规则),由加密算法以及非对称加密密钥生成
2.1 Token的身份验证方法
过程: 1、用户登录通过后,服务器端数据签名,再和数据一起作为token串回给浏览器,自己保存 签名和密钥。 2、客户端保存 token,下次请求的时候在header头里带上 token就行 3、服务器端接收到请求后对 token 中的数据再以同样的方式进行签名,看签名是不是自己的签名
token 中的数据是明文保存的,所以我不能在其中保存像密码这样的敏感信息。 token的生成一般是采用uuid保证唯一性,当用户登录时为其生成唯一的token,存储一般保存在数据库中 token过期时间采用把token二次保存在cookie或session里面,根据cookie和session的过期时间去维护token的过期时间 token有撤回的操作,通过token revocataion可以使一个特定的token或是一组有相同认证的token无效
2.2 token 优点:
无状态、可扩展 在客户端存储的Tokens是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载负载均衡器能够将用户信息从一个服务传到其他服务器上。
同时因为tokens自己hold住了用户的验证信息也解决了 session 在用户量大时,可能会造成一些拥堵的问题。
安全性 请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。
token是有时效的,一段时间之后用户需要重新验证。我们也不一定需要等到token自动失效,token有撤回的操作,通过token revocataion可以使一个特定的token或是一组有相同认证的token无效。
可扩展性 Tokens能够创建与其它程序共享权限的程序使用tokens时,可以提供可选的权限给第三方应用程序。当用户想让另一个应用程序访问它们的数据,我们可以通过建立自己的API,得出特殊权限的tokens。
多平台跨域 CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。只要用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到。 基于标准创建token的时候,你可以设定一些选项。它支持众多的语言。
|