前端应该掌握的登录认证知识

1背景

前一段时间,参与了老项目的迁移工作,配合后端接口迁移时,由于两个项目采取了不一样的登陆方案,所以遇到了跨域登录态无法共享的问题。经过各方协调,最终老项目将迁移页面部署在新项目的指定网关下,并且使用新项目的SSO登录方案。由迁移中遇到的登陆态共享问题,引发了我对SSO的思考与学习。如果发现文章中有什么错误之处,请及时指正~??

2登录态维护方式2.1JWT(JsonWebToken)2.1.1是什么?

JWT是一个开放的JSON格式token存储标准。它定义了一种安全、紧凑的方式来保存数据,通过签名的方式来校验token的合法性,主要支持的签名算法如HMAC、RSA、ECDSA。

通常使用它来保存登录信息,相比传统的session方案,它的优点在于服务端无需维护登录态,不再需要依赖第三方存储(如redis、memcached),所以说JWT是无状态的。

但它也存在缺点。由于它只在客户端维护,因此服务端无法方便的清除登录态,相比传统的session方案,只需要将session清除即可。你可能会说,可以直接将这个token删除就算退出登录了。但实际上这只是一种假注销,若该用户再次拿到相同的token还是会被认为是登录的。

2.1.2数据结构

实际上JWT是由header(头部)、payload(负载)、signature(签名)这三个部分组成的,中间用.来分隔开,写成一行就是这个样子的:Header.Payload.Signature。

Header:该部分是一个JSON对象,描述JWT的元数据,通常是下面的样子。

{"alg":"HS",//表示签名的算法(algorithm),默认是HMACSHA(写成HS)"typ":"JWT"//表示这个令牌(token)的类型(type),JWT令牌默认统一写为JWT}Playload:该部分也是一个JSON对象,用来存放实际需要传递的数据。JWT规定了7个官方字段,供选用。除了官方的字段,还可以自定义一些其他字段。

iss(issuer):签发人exp(expirationtime):过期时间sub(subject):主题aud(audience):受众nbf(NotBefore):生效时间iat(IssuedAt):签发时间jti(JWTID):编号

??JWT默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。这个JSON对象也要使用Base64URL算法转成字符串。

Signature:该部分是对前两部分的签名,防止数据篡改。首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用Header里面指定的签名算法(默认是HMACSHA),按照下面的公式产生签名。服务器收到JWT后通过对比签名来确定Token是否被修改。

HMACSHA(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)Base64Url:这个算法跟Base64算法基本类似,但有一些小的不同。JWT作为一个令牌,有些场合可能会放到URL(比如api.example.


转载请注明:http://www.aierlanlan.com/grrz/214.html