Skip to content
导航

认证服务

认证策略分为三类:

  • HTTP Basic 认证
  • 基于Session的认证
  • 基于Token的认证

HTTP Basic 认证

HTTP Basic 认证 实现简单,但功能弱:

  • 不安全。后续任何同源请求,浏览器都会自动为请求头带上缓存的Authorization标头,其中包含用户的敏感信息如密码
  • 不能跨子域
  • 登录过期取决于浏览器缓存过期

基于Session的认证

Session认证 实现较难,因为需要服务端存储 Session ID,带来管理 Session ID 的问题。例如随服务端规模的增长,需要共享 Session ID。 得益于服务端存储和管理登录状态,功能强:

  • 安全。Session ID 不含用户信息,泄露影响小
  • 任意位置存储,并且存储字符大小可以做到相比其他方案最小
  • 登录过期可控,并可以实现登录“互踢”功能

github.com 使用的就是Session认证

基于Token的认证

Token认证 实现较简单,不需要服务端存储,但需要制定Token加解密规则。功能较强:

  • 安全。Token是服务端加密过的字符串,泄露影响小
  • 任意位置存储,但存储字符大小相比其他方案最大
  • 登录过期可定义,例如在 Token 中记录登录日期,那么可以在定义日期后自动过期

JWT(JSON Web Token)

由于 Token 认证在三类认证策略中经济实惠,成为最受欢迎的方案,那么制定Token加解密规则就成为了开发者经常思考的问题。

JWT是一种Token认证形式,基于开放标准(RFC 7519)。

举例一个JWT的结构

header.payload.signatrue

或者换种表意

description.data.secret

它为Token添加了可读性,并通过加密签名的方式为Token防篡改。

因此,即使JWT上除签名外,所有内容都不是敏感信息,并且信息未加密可读取,它仍然是一个有效的Token,可以作为登录用的凭据,此时签名就承担了Token的认证作用。

工具库

有标准就可以封装为工具库,如npm包 jsonwebtoken

登录作为普遍的业务场景,每家公司都会有自己的实现方式,一般只需要了解原理。如需实践,可以参考开源的npm库 passport