在我们的java业务系统中,或多或少都会涉及到权限、认证等概念。但是很多朋友还是傻傻分不清这些概念和区别。今天我们就来好好看看它们,把差异的概念深深地刻在我们的脑海里。身份验证百度百科对身份验证的解释是:身份验证(Authentication),在.NETFrameworksecurity中,是通过针对某些机构检查用户的凭据来发现和验证主体身份的过程。当然,我们今天肯定不会用这么生硬的话来解释。通俗地说,就是验证当前用户的身份,证明“你就是你自己”(比如每天上下班签到,需要用指纹签到。当你的指纹与系统输入的指纹相符,即登录成功)常用认证方式:用户名密码、登录邮箱、发送登录链接、手机号、接收验证码。只要您能收到邮箱/验证码,就默认您是账户的主人。某些资源的权限。比如你安装手机应用,APP肯定会弹出来询问是否授予权限(访问相册、定位等);获取昵称、头像、地区、性别等个人信息)实现授权:cookie、session、token、OAuth证书Credentials认证授权的前提是需要一个介质(证书)来标识访问者的身份。这个其实很好理解,每个人都要有身份证。有了身份证,我们就可以办理手机卡/银行卡/个人贷款/交通卡等,这就是身份验证的凭证。在互联网应用中,一般的网站有两种模式,访客模式和登录模式。在游客模式下,您可以正常浏览网站文章。一旦你想要点赞/收藏/分享文章,你需要登录或注册一个账号。登录模式,当用户登录成功后,服务器会向用户使用的浏览器颁发一个令牌(token)。此令牌用于指示您的身份。浏览器每次发送请求都会带上这个token。您可以使用访客模式下无法使用的功能。CookieHTTP是无状态协议(没有内存进行事务处理,每次客户端和服务器会话完成时服务器不会保存任何会话信息):每个请求都是完全独立的,服务器无法确认当前访问的身份发件人的信息,无法判断上次请求的发件人和本次的发件人是不是同一个人。因此,为了进行会话跟踪(知道谁在访问我),服务器和浏览器必须主动维护一个状态,用于通知服务器前后两次请求是否来自同一个浏览器。而这个状态需要通过cookie或者session来实现。Cookie存储在客户端:Cookie是服务器发送给用户浏览器并存储在本地的一小段数据。下次浏览器再次向同一服务器发出请求时,它会被携带并发送给服务器。Cookies不跨域:每个cookies都绑定一个域名,不能在其他域名下使用。允许一级域名和二级域名共享使用(视域而定)。SessionSession是另一种记录服务器和客户端会话状态的机制。通常,session是基于cookie实现的,session保存在服务器端,sessionId保存在客户端的cookie中。Session认证过程:当用户第一次请求服务器时,服务器根据用户提交的相关信息创建相应的Session。当请求返回时,将Session的唯一标识信息SessionID返回给浏览器。浏览器收到服务器返回的SessionID信息后,会将这些信息保存在cookie中,cookie会记录这个SessionID属于哪个域名。当用户第二次访问服务器时,请求会自动判断该域名下是否有cookie信息,如果有则自动将cookie信息发送到服务器端,服务器会获取SessionID从cookie中,然后根据SessionID查找对应的Session信息。如果没有找到,说明用户没有登录或者登录无效。如果找到Session,则证明用户已经登录,可以进行下面的操作。目前,大多数系统都是基于这个原则来验证用户的登录状态。Cookie和Session的区别应该是面试中问的非常多的一个问题。安全性:Session比Cookie安全,Session保存在服务器端,Cookie保存在客户端。访问值的类型不同:Cookie只支持存储字符串数据,如果要设置其他类型的数据,需要转成字符串,而Session可以存储任何数据类型。有效期不同:Cookies可以设置为长期有效。比如我们经常使用的默认登录功能,Session一般都有一个很短的过期时间,在客户端关闭(默认)或者Session超时的时候就会过期。存储大小不同:单个cookie保存的数据不能超过4K,session可以存储的数据比cookie多很多,但是当访问量过多时,会占用过多的服务器资源。TokenTokenAcesssToken是访问资源接口(API)时需要的资源凭证。一个简单的token的组成是:uid(用户的唯一标识),time(当前时间的时间戳),sign(签名,token的前几位用Hash算法压缩成一定长度的十六进制string)AccesssToken的特点是*无状态服务器,扩展性好*支持移动设备*安全*支持跨程序调用令牌认证过程如下:客户端使用用户名和密码请求登录服务器。服务端收到验证用户名和密码的请求后,会颁发一个token,并将token发送给客户端。客户端收到令牌后,会将它存储起来,比如在cookie中或者在localStorage中。客户端每次向服务端请求资源时,都需要带上服务端颁发的token。服务器接收请求,然后验证客户端请求中包含的令牌。如果验证成功,则将请求的数据返回给客户端。RefreshToken刷新令牌是专用于刷新访问令牌的令牌。如果没有refreshtoken,accesstoken也可以刷新,但是每次刷新用户都要输入登录用户名和密码,会很麻烦。有了refreshtoken就可以减少这个麻烦,客户端直接使用refreshtoken来更新accesstoken,不需要用户额外操作。AccessToken的有效期比较短。当AccesssToken过期失效时,可以通过RefreshToken获取新的Token。如果RefreshToken也失效,用户只能重新登录。RefreshToken及其过期时间保存在服务器的数据库中,只有在申请新的AccesssToken时才会进行验证,不会影响业务接口的响应时间,不需要像会话处理大量询问。Token和Session的区别Session是一种记录服务器和客户端会话状态的机制,使服务器有状态,记录会话信息。而Token是令牌,是访问资源接口(API)所需要的资源凭证。Token使服务器无状态,不存储session信息。Session和Token并不矛盾。作为身份认证令牌,安全性优于Session,因为每个请求都有签名,可以防止监听和重放攻击,而Session必须依赖链路层来保证通信安全。如果你需要实现有状态的会话,你仍然可以添加Session在服务器端保存一些状态。所谓Session认证只是简单地将User信息保存在Session中,由于SessionID的不可预测性,暂时认为是安全的。而Token,如果指的是OAuthToken或者类似的机制,提供认证和授权。认证是针对用户的,授权是针对应用的。其目的是赋予应用程序访问用户信息的权利。这里的Token是独一无二的。不能转让给其他应用,也不能转让给其他用户。Session只提供简单的认证,即只要有这个SessionID,就认为拥有这个User的所有权限。它需要严格保密。此数据应仅存储在网站上,不应与其他网站或第三方应用程序共享。所以简单来说:如果你的用户数据可能需要分享给第三方,或者允许第三方调用某个API接口,就使用Token。如果永远只是自己的网站和自己的App,用什么都无所谓。JWT(JSONWebToken)JSONWebToken(简称JWT)是目前最流行的跨域认证方案。JWT是一种基于JSON的开放标准(RFC7519),用于在网络应用程序环境之间传输声明。JWT声明一般用于在身份提供者和服务提供者之间传递经过认证的用户身份信息,从而从资源服务器获取资源。例如,它用于用户登录。JWT可以使用HMAC算法或RSA公钥/私钥进行签名。由于数字签名的存在,这些传输的信息是可信的。JWT认证流程:用户输入用户名/密码登录,服务端认证成功后,会返回一个JWT给客户端。客户端将token保存在本地(一般使用localstorage,或者使用cookies)当用户想要访问一个受保护的路由或者资源时,需要使用Bearer方式在请求头的Authorization字段中添加JWT
