java面试之单点登录

1. Token

普通Token

普通令牌是在用户提交账号和密码登陆成功之后,服务器会返回一串令牌的字符串给客户端并将令牌保存在数据库或者缓存中。它唯一标识存贮在数据库或内存中的用户信息。

Acesss Token

  • 访问资源接口(API)时所需要的资源凭证

  • 简单 token 的组成: uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)

  • 特点:

    • 服务端无状态化、可扩展性好
    • 支持移动端设备
    • 安全
    • 支持跨程序调用
  • token 的身份验证流程:

img

  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求,去验证用户名与密码
  3. 验证成功后,服务端会签发一个 token 并把这个 token 发送给客户端
  4. 客户端收到 token 以后,会把它存储起来,比如放在 cookie 里或者 localStorage 里
  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 token
  6. 服务端收到请求,然后去验证客户端请求里面带着的 token ,如果验证成功,就向客户端返回请求的数据

每一次请求都需要携带 token,需要把 token 放到 HTTP 的 Header 里

基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据。用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库

token 完全由应用管理,所以它可以避开同源策略

Refresh Token

refresh token 是专用于刷新 access token 的 token。如果没有 refresh token,也可以刷新 access token,但每次刷新都要用户输入登录用户名与密码。有了 refresh token,客户端直接用 refresh token 去更新 access token,无需用户进行额外的操作。

img

Access Token 有效期比较短,当 Acesss Token 由于过期而失效时,使用 Refresh Token 就可以获取到新的 Token,如果 Refresh Token 也失效了,用户就只能重新登录了。

Refresh Token 及过期时间是存储在服务器的数据库中,只有在申请新的 Acesss Token 时才会验证,不会对业务接口响应时间造成影响,也不需要向 Session 一样一直保持在内存中以应对大量的请求。

JWT

Json web token (JWT)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。该token被设计为紧凑且安全,特别适用于分布式站点单点登录场景。

JWT由头部(header)、载荷(payload)、签证(signature) 三部分组成。

header

jwt头部承载两部分信息:

  • 声明类型,这里是jwt
  • 声明加密的算法 通常直接使用 HMAC SHA256
{
  'typ': 'JWT',
  'alg': 'HS256'
}
//将头部进行base64加密(对称加密),构成了第一部分

playload

  • 标准中注册的声明
  • 公共的声明
  • 私有的声明

标准中注册的声明 (建议但不强制使用) :

  • iss: jwt签发者
  • sub: jwt所面向的用户
  • aud: 接收jwt的一方
  • exp: jwt的过期时间,这个过期时间必须要大于签发时间
  • nbf: 定义在什么时间之前,该jwt都是不可用的.
  • iat: jwt的签发时间
  • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

公共的声明 :
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.

私有的声明 :

私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
//将头部进行base64加密(对称加密),得到Jwt的第二部分

signature

  • header (base64后的)
  • payload (base64后的)
  • secret

base64加密后的header和base64加密后的payload连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

JWT技术生成的token,客户端在保存的时候可以考虑sessionStorage或localStorage或请求头中,当然也可放在Cookie里,不推荐。

localStorage的生命周期是永久的,除非主动删除数据;sessionStorage生命周期是在仅在当前会话下有效

当用户希望访问一个受保护的路由或者资源的时候,可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求头信息的 Authorization 字段里,使用 Bearer 模式添加 JWT。

Authorization: Bearer

注意事项

  • Base64编码方式是可逆的,JWT token中不应该在载荷里面加入任何敏感的数据,比如用户的密码
  • jwt token的过期时间一般不要过长
  • jwt token 不要放在 Cookie 中,有 CSRF 风险
  • jwt token中的数据可以篡改,但是签名无法篡改
  • jwt想解决token注销,需要以用户id为key,把JWT的id存入redis

2. Cookie 、 Session、Token

  • 安全性: Session 比 Cookie 安全,Session 是存储在服务器端,Cookie 是存储在客户端。

  • 存取值的类型不同:Cookie 只支持存字符串数据,Session 可以存任意数据类型。

  • 有效期不同: Cookie 可设置为长时间保持,比如我们经常使用默认登录功能,Session 一般失效时间较短。

  • 存储大小不同: 单个 Cookie 保存数据不能超过 4K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。


Session 是一种记录服务器和客户端会话状态的机制,使服务端有状态化,可以记录会话信息。而 Token 是令牌访问资源接口(API)时所需要的资源凭证。Token 使服务端无状态化,不会存储会话信息。

  • 身份认证 Token 安全性比 Session 好。

  • 浏览器会自动带上cookie,但是不会自动带上token

4. 单点

单点登录是在分布式服务中,用户只需要在一处登录,即可在各个受信任的服务器之间,共享登录状态。

实现单点登录有多种方式,其区别就在于是否能解决跨域登录

5. OAuth

OAuth 是一个行业的标准授权协议,主要用来授权第三方应用获取有限的权限。实际上它就是一种授权机制,最终目的是为第三方应用颁发一个有时效性令牌 token,使得第三方应用能够通过该令牌获取相关的资源。

OAuth 2.0 比较常用的场景就是第三方登录,当你的网站接入了第三方登录时一般就是使用的 OAuth 2.0 协议。

现在OAuth 2.0也常见于支付场景(微信支付、支付宝支付)和开发平台(微信开放平台、阿里开放平台等等)。

参考

还分不清 Cookie、Session、Token、JWT?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值