鉴权
2020-04-16 11:09:37 0 举报
AI智能生成
前端鉴权知识
作者其他创作
大纲/内容
session 认证
问题
<font color="#16884a">服务端开销大</font>: <br>每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,<br><b>通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大</b>。<br><br><font color="#16884a">扩展性有限</font>: <br>用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,<br>这意味着<b>用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源</b>,<br>这样<b>在分布式的应用上,限制了负载均衡器的能力,</b>这<b>也意味着限制了应用的扩展能力</b>。<br><br><font color="#16884a">CSRF攻击威胁</font>: <br>因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。<br>
token 验证
它<b>不需要在服务端去保留用户的认证信息或者会话信息</b>。<br>这就意味着<b>基于token认证机制的应用不需要去考虑用户在哪一台服务器登录</b>,这就为应用的扩展提供了便利。<br>
流程
<ol><li>用户使用用户名密码来请求服务器<br></li><li>服务器进行验证用户的信息<br></li><li>服务器通过验证发送给用户一个token<br></li><li>客户端存储token,并在每次请求时附送上这个token值<br></li><li>服务端验证token值,并返回数据<br></li></ol>
问题??
缺陷是 token 只能当作身份认证凭证,但是 JWT 还可以传输其他必要数据 ???
JWT
<b>Json web token</b> (JWT), <br>是为了在网络应用环境间传递声明而执行的一种<b>基于JSON的开放标准</b><br>
构成
JWT<b>由三段信息构成</b>,将这三段信息文本<b>用.链接</b>一起就构成了Jwt字符串。<br>例如:<br>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ<br>
三部分
头部
jwt的头部承载两部分信息:<br><br><ol><li>声明类型,这里是jwt<br></li><li>声明加密的算法 通常直接使用 HMAC SHA256</li></ol>
完整的头部就像下面这样的JSON:<br>{<br>'typ': 'JWT',<br>'alg': 'HS256'<br>}<br><br>然后<b>将头部进行base64加密</b>(该加密是可以对称解密的),<b>构成了第一部分</b>.<br><br>eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9<br>
载荷
载荷就是存放有效信息的地方,这些有效信息包含三个部分<br><br><ol><li>标准中注册的声明<br></li><li>公共的声明<br></li><li>私有的声明<br></li></ol>
定义一个payload:<br><br>{<br> "sub": "1234567890",<br> "name": "John Doe",<br> "admin": true<br>}<br><br>然后<b>将其进行base64加密,得到Jwt的第二部分</b>。<br><br>eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9<br>
签证
由三部分组成:<br><br><ol><li>header (base64后的)<br></li><li>payload (base64后的)<br></li><li>secret<br></li></ol>
⚠️ 注意:<b>secret是保存在服务器端的</b>,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,<br>所以,它就是你服务端的私钥,<b>在任何场景都不应该流露出去</b>。<br>一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。<br>
应用
一般是<font color="#16884a">在请求头里加入Authorization,并加上Bearer标注</font>:<br><br>fetch('api/user/1', {<br> headers: {<br> <font color="#924517">'Authorization': 'Bearer ' + token</font><br> }<br>})<br>
优点
<ol><li>因为<b>json的通用性,所以JWT可以进行跨语言支持</b>,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。<br></li><li>因为有了payload部分,所以JWT可以在自身<b>存储一些其他业务逻辑所必要的非敏感信息</b>。<br></li><li>便于传输,jwt的构成非常简单,<b>字节占用很小</b>,所以它是非常<b>便于传输</b>的。<br></li><li>它<b>不需要在服务端保存会话信息, 易于应用的扩展</b><br></li></ol>
缺点
<ol><li><b>服务器不保存会话状态</b>,所以在使用期间没有取消令牌或更改令牌的权限。也就是说,<b>一旦JWT签发,在有效期内将会一直有效</b>。<br></li><li>JWT本身包含认证信息,因此<b>一旦信息泄露,任何人都可以获得令牌的所有权限</b>。为了减少盗用,JWT的<b>有效期不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行进行身份验证</b>。<br></li><li>为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是<b>使用加密的HTTPS协议</b>进行传输。<br></li></ol>
OAuth(开放授权)
OAuth 是一种授权机制。<br><b>数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据</b>。<br><b>系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用</b>。<br>
令牌特点
(1)<b>令牌是短期的,到期会自动失效</b><br>(2)<b>令牌可以被数据所有者撤销,会立即失效</b>。<br>(3)<b>令牌有权限范围(scope)</b>,<b>只读令牌就比读写令牌更安全</b>。<br>
参考
https://www.jianshu.com/p/576dbf44b2ae
https://baijiahao.baidu.com/s?id=1608021814182894637&wfr=spider&for=pc
http://www.ruanyifeng.com/blog/2019/04/oauth_design.html
0 条评论
下一页