安全认证机制

安全认证机制

最近项目要用到安全验证了,以前的实现方式都是单个服务模式,加拦截器和cookie即可。现在在微服务上需要实现单点登录,重写了解一下认证机制。

1. HTTP Basic Auth

最简单的一种实现,每次请求API都提供用户的账号与密码。但这种方式会有信息暴露风险。使用的越来越少。

2. OAuth

OAuth(开放授权)是一个开放的授权标准,允许用户让第三方应用访问该用户在某一服务器上的资源,而无需将用户名和密码提供给第三方应用。如:微信/QQ登录第三方网站等。

OAuth允许用户提供一个令牌,而不是账号和密码来访问用户的数据。每一个令牌授权一个特定的第三方系统在特定的时间段内访问特定的资源。。这 样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信 息,而非所有内容。

OAuth2.0流程如下:


3. Cookie-Session 机制

    该机制为一次请求认证在服务端创建一个Session对象,同时在客户端创建一个Cookie对象。通过客户端上带来的Cookie与服务端的Session对象匹配来实现状态管理。cookie与session可以设置过期时间。


4. JWT实现令牌(token)

    一种无状态的方式,在服务端不需要存储用户的登录记录。

流程如下:


    客户端使用用户名与密码登录

    服务端收到请求,验证用户名与密码

    验证成功后,服务端签发一个token,再把token发送给客户端

    客户端收到并存储token,如放在cookie中 ,发送的时候它应该保存在请求头里

    客户端每次去访问服务器带着token

    服务器收到请求,验证token,如果验证成功,就返回响应

5. Token对于Cookie机制的好处

    支持跨域访问: Cookie是不允许垮域访问的,这一点对Token机制是不存在的,前提 是传输的用户认证信息通过HTTP头传输.

    无状态(也称:服务端可扩展行):Token机制在服务端不需要存储session信息,因为 Token 自身包含了所有登录用户的信息,只需要在客户端的   cookie或本地介质存储 状态信息.

    更适用CDN: 可以通过内容分发网络请求你服务端的所有资料(如:javascript, HTML,图片等),而你的服务端只要提供API即可.

    去耦: 不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在 你的API被调用的时候,你可以进行Token生成调用即可.

    扩展性: 使用session用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。

    更适用于移动应用: 当你的客户端是一个原生平台(iOS, Android,Windows 8等) 时,Cookie是不被支持的(你需要通过Cookie容器进行处理),这时采用Token认 证机制就会简单得多。

    CSRF:因为不再依赖于Cookie,所以你就不需要考虑对CSRF(跨站请求伪造)的防 范。

    性能: 一次网络往返时间(通过数据库查询session信息)总比做一次HMACSHA256 计算 的Token验证和解析要费时得多.

    不需要为登录页面做特殊处理: 如果你使用Protractor 做功能测试的时候,不再需要 为登录页面做特殊处理.

    基于标准化:你的API可以采用标准化的 JSON Web Token (JWT). 这个标准已经存在 多个后端库(.NET, Ruby, Java,Python, PHP)和多家公司的支持

6. JWT

    JSON Web Token: 三部分组成:header+payload+signature

    头信息指定了该JWT使用的签名算法:

    header = '{"alg":"HS256","typ":"JWT"}'

    消息体包含了JWT的意图,包含一些需要传输的消息:

        payload = '{"loggedInAs":"admin","iat":1422779638}'//iat表示令牌生成的时间

    未签名的令牌由base64url编码的头信息和消息体拼接而成(使用"."分隔),签名则通过私有的key计算而成:

        key='secretkey'//服务器的私钥

        unsignedToken=encodeBase64(header)+'.'+encodeBase64(payload)

        signature=HMAC-SHA256(key, unsignedToken)

    最后在未签名的令牌尾部拼接上base64url编码的签名(同样使用"."分隔)就是JWT了:

        token=encodeBase64(header)+'.'+encodeBase64(payload)+'.'+encodeBase64(signature)

    # token看起来像这样:         eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

    一般使用为Authorization: Bearer token串形式

jwt误区

防止token被窃取

CSRF 简介

CSRF攻击攻击原理及过程如下:

    1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

    2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

    3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

  4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

  5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

(一般情况下,关闭网页后cookie即被删除)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。