作者:zyz1992
在我们的java业务系统中,或多或少存在着权限、认证等相关概念。但是很多小伙伴还是傻傻的分不清这些概念和区别。今天我们就好好看看,把差异这个概念深深的刻在脑子里。
认证认证
百度百科对身份验证的解释是:身份验证,通过与in中的一些机构核对用户的凭证,发现并验证主体身份的过程。NET框架安全性。
当然,我们今天的讨论肯定不会用这么直白的话来解释。
一般来说,就是验证当前用户的身份,证明“你就是你自己”(比如你每天上下班打卡,需要用你的指纹打卡,当你的指纹与系统中输入的指纹匹配时,你就打卡成功)。
用户名密码登录邮箱发送登录链接手机号接收验证码只要你能收到邮件/验证码,默认你就是账号的主人。
授权授权
授权意味着用户授权其他应用程序访问该用户的某些资源。
比如你安装手机app,APP肯定会跳出来问你是否允许授予权限(访问相册、位置等权限);当你访问微信小程序时,当你登录时,小程序会询问你是否允许授予权限(获取昵称、头像、地区、性别等个人信息)。
实现授权的方式有:cookie、session、token、OAuth。
资格证书
认证授权的前提是需要一个介质(证书)来标记访问者的身份。
这个其实很好理解。每个人都必须有身份证。过了身份证就可以办理手机卡/银行卡/个贷/交通等等。这是认证证书。
在互联网的应用中,一般网站有两种模式:访问者模式和登录模式。
在旅游模式下,您可以正常浏览网站上的文章。一旦你想喜欢/收藏/分享文章,你需要登录或注册一个帐户。登录模式,当用户登录成功后,服务器会给用户使用的浏览器颁发一个令牌,用来表明你的身份。浏览器每次发送请求都会带这个令牌,可以使用旅游模式下无法使用的功能。
饼干
HTTP是一种无状态协议(它没有用于事务处理的内存,每次客户端和服务器的会话完成时,服务器不会保存任何会话信息):每个请求都是完全独立的,服务器无法确认当前访问者的身份信息,也无法分辨上一个请求的发送者和这个发送者是否是同一个人。
因此,为了跟踪会话(知道谁在访问我),服务器和浏览器必须主动维护一个状态,这个状态用来告诉服务器这两个请求是否来自同一个浏览器。而这种状态需要通过cookie或者session来实现。
cookie存储在客户端:cookie是由服务器发送到用户浏览器并保存在本地的一小段数据。下次浏览器向同一个服务器发出请求时,它将被携带并发送到服务器。
cookie不是跨域的:每个cookie都绑定到一个域名,不能在其他域名下使用。一级域名和二级域名允许共享(视域而定)。
会议
会话是记录服务器和客户端之间会话状态的另一种机制。通常,会话是基于cookie的,会话存储在服务器中,sessionId会存储在客户端的cookie中。
会话认证过程:
当用户第一次向服务器请求时,服务器根据用户提交的相关信息创建相应的会话,并将该会话的唯一标识信息SessionID返回给浏览器。在浏览器收到服务器返回的SessionID信息后,它会将该信息存储在一个Cookie中。同时,Cookie会记录这个SessionID属于哪个域名。当用户第二次访问服务器时,请求会自动判断该域名下是否有Cookie信息。如果有,Cookie信息将自动发送到服务器,服务器将从Cookie中获取SessionID。然后根据SessionID搜索对应的会话信息。如果没有找到,说明用户没有登录或者登录无效。如果找到了,就可以证明用户已经登录了,然后执行下面的操作。目前大部分系统都是根据这个原理来验证用户的登录状态。
Cookie和会话的区别
这个问题在面试中应该会被问的非常频繁。
安全性:会话比Cookie更安全。会话存储在服务器端,Cookie存储在客户端。访问值的类型不同:Cookie只支持存储字符串数据,如果要设置其他类型的数据,需要转换成字符串。会话可以存储任何数据类型。有效期不同:Cookie可以设置为长期保存,比如我们经常使用的默认登录功能,会话一般会在短时间内过期,客户端关闭(默认)或者会话会过期。存储大小不一样:单个Cookie存储的数据不能超过4K,一个会话存储的数据比Cookie高很多,但是访问太多的时候会占用太多服务器资源。
令牌令牌
ACESSToken访问资源接口(API)所需的资源凭证由uid(用户的唯一身份)、time(当前时间的时间戳)和sign(签名,令牌的前几个数字通过哈希算法压缩成一定长度的十六进制字符串)组成。
AcessToken的特点是*无状态服务器,扩展性好*支持移动设备*安全性*支持跨程序调用。
令牌的认证过程如下:
客户端请求使用用户名和密码登录。在收到验证用户名和密码的请求后,服务器将颁发一个令牌并将其发送给客户端。收到令牌后,客户端将存储它。例如,每次客户机向服务器请求cookie或localStorage中的资源时,它都需要携带服务器颁发的令牌来接收请求,然后验证客户机请求中的令牌。如果验证成功,它会将请求的数据返回给客户端。刷新令牌刷新令牌专用于刷新访问令牌。
如果没有刷新令牌,也可以刷新访问令牌,但是每次刷新都要求用户输入登录用户名和密码,会很麻烦。有了刷新令牌,可以减少这种麻烦,客户端可以直接用刷新令牌更新访问令牌,无需用户额外操作。
接入令牌的有效期相对较短。当AcessToken因过期而失效时,可以使用刷新令牌获得新的令牌。如果刷新令牌也过期,用户只能再次登录。
刷新令牌和过期时间存储在服务器的数据库中,只有在申请新的Acesss令牌时才会进行验证,不会影响业务接口的响应时间,也不需要一直保存在内存中来应对大量的Session之类的请求。
令牌和会话的区别
Session是一种记录服务器和客户端之间会话状态的机制,使得服务器有状态,可以记录会话信息。Token即令牌,是访问资源接口(API)所需的资源凭证。令牌使服务器无状态,并且不存储会话信息。
会话和令牌并不矛盾。作为一种认证方式,Token比Session更安全,因为每个请求都经过签名,可以防止拦截和重放攻击,而Session必须依靠链路层来保证通信安全。如果您需要实现有状态会话,您仍然可以添加一个会话来保存服务器端的一些状态。
所谓的会话认证只是将用户信息存储到会话中。因为SessionID是不可预测的,所以暂时认为它是安全的。Token,如果是指OAuth令牌或者类似的机制,提供认证和授权,认证是给用户的,授权是给App的。它的目的是赋予应用程序访问用户信息的权利。这里的令牌是唯一的。不能转移到其他app,也不能转移到其他用户。Session只提供一个简单的认证,就是只要有这个SessionID,就认为拥有这个用户的所有权限。这需要严格保密。这些数据只应保存在网站上,不应与其他网站或第三方应用程序共享。
所以简单来说:如果你的用户数据可能需要与第三方共享,或者允许第三方调用API接口,就用Token。如果你一直只是自己的网站,自己的App,那你用什么都无所谓。
JWT(JSON Web令牌)
JSON Web Token (JWT)是目前最流行的跨域认证解决方案。
JWT是一个基于JSON的开放标准(RFC 7519 ),用于在网络应用环境之间传输声明。JWT语句一般用于在身份提供者和服务提供者之间传递经过认证的用户身份信息,从而从资源服务器获取资源。例如用户登录。
可以使用HMAC算法或RSA的公钥/私钥对JWT进行签名。由于数字签名的存在,这些传输的信息是可信的。
JWT认证流程:
当用户通过输入用户名/密码登录,并且服务器认证成功时,它将向客户端返回一个JWT客户端,以在本地保存令牌(通常使用localstorage或cookie)。当用户想要访问受保护的路由或资源时,他需要使用承载模式在请求报头的授权字段中添加JWT,其内容如下所示。
温馨提示:注:内容来源均采集于互联网,不要轻信任何,后果自负,本站不承担任何责任。若本站收录的信息无意侵犯了贵司版权,请给我们来信(j7hr0a@163.com),我们会及时处理和回复。
原文地址"token比session好在哪,jwt token和session":http://www.guoyinggangguan.com/xedk/212817.html。
微信扫描二维码关注官方微信
▲长按图片识别二维码

