什么是JWT

本文详细介绍了API鉴权的几种方式,包括cookie+session、HTTPBasic和HTTPDigest,重点讲解了Token和JWT(JSON Web Tokens)的工作原理和安全性。JWT由头部、载荷和签名三部分组成,常用于API鉴权,可有效防止CSRF攻击。同时,文章讨论了JWT的存储方式、使用策略以及与CSRF和XSS攻击的防护。最后,提到了Token管理和使用时的注意事项,如有效期控制和敏感信息加密。

TOKEN

token 是一串字符串,通常因为作为鉴权凭据,最常用的使用场景是 API 鉴权。

API 鉴权

API鉴权的方式有以下几种

  • cookie + session
    和平常 web 登陆一样的鉴权方式

  • HTTP Basic

账号和密码拼接然后 base64 编码加到 header
头中
。很显然,因为账号和密码几乎是『明文』传输的,而且每次请求都传,安全性可想而知。

所以,这种方式是好少使用的

  • HTTP Digest

将账号和密码加上其他一些信息拼接然后取摘要加到 header 头中。

不过其实最大的问题还是:每次请求都要对账号、密码取一次摘要,也就是说每次请求都要有账号和密码,也就是说账号和密码要么缓存一下,要么就每次请求要去用户输一次密码,这样显然不合适。

  • Token

token通过一次登录验证,得到一个鉴权字符串,然后以后带着这个鉴权字符串进行后续操作,这样就可以解决每次请求都要带账号密码的问题,而且也不需要反复使用账号和密码。

CSRF 攻击

构成这个攻击的原因,就在于 Cookie + Session 的鉴权方式中,鉴权数据(cookie 中的
session_id)是由浏览器自动携带发送到服务端的
,借助这个特性,攻击者就可以通过让用户误点攻击链接,达到攻击效果。而 token
是通过客户端本身逻辑作为动态参数加到请求中的,token 也不会轻易泄露出去,因此 token 在 CSRF 防御方面存在天然优势

JWT 的组成

JWT 全称 JSON Web Tokens ,是一种规范化的 token。可以理解为对 token 这一技术提出一套规范,是在 RFC 7519 中提出的

组成

一个 JWT token 是一个字符串,它由三部分组成,头部、载荷与签名,中间用 . 分隔,例如:xxxxx.yyyyy.zzzzz

头部(header)

头部通常由两部分组成:令牌的类型(即 JWT)和正在使用的签名算法(如 HMAC SHA256 或 RSA.)。
例如:

{
  "alg": "HS256",
  "typ": "JWT"
}
载荷(Payload)

载荷中放置了 token 的一些基本信息,以帮助接受它的服务器来理解这个 token。同时还可以包含一些自定义的信息,用户信息交换

载荷的属性也分三类:

  • 预定义(Registered)
  • 公有(public)
  • 私有(private)

预定义的载荷

{
  "sub": "1",
  "iss": "http://localhost:8000/auth/login",
  "iat": 1451888119,
  "exp": 1454516119,
  "nbf": 1451888119,
  "jti": "37c107e4609ddbcc9c096ea5ee76c667",
  "aud": "dev"
}

这里面的前 7 个字段都是由官方所定义的,也就是预定义(Registered claims)的,并不都是必需的

  • iss (issuer):签发人
  • sub (subject):主题
  • aud (audience):受众
  • exp (expiration time):过期时间
  • nbf (Not Before):生效时间,在此之前是无效的
  • iat (Issued At):签发时间
  • jti (JWT ID):编号
签名(Signature)

签名时需要用到前面编码过的两个字符串,如果以 HMACSHA256 加密

HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    secret
)

加密后再进行 base64url 编码最后得到的字符串就是 token 的第三部分 zzzzz

组合便可以得到 token:xxxxx.yyyyy.zzzzz。

JWT 的使用有两种方式
  • 加到 url 中:?token=你的token
  • 加到 header 中,建议用这种,因为在 https 情况下更安全:Authorization:Bearer 你的token

JWT 在客户端的存储有三种方式

  • LocalStorage
  • SessionStorage
  • Cookie [不能设置 HTTPonly]
    值得注意的是,Cookie的这种方式有的移动端是不支持的,但是我们可以配合其他方式去使用
    最推荐的还是第三种,因为第一二种存在跨域读取限制,而 Cookie 使用不同的跨域策略

Cookie 的跨域策略

子可以读父,但是父不可以读子,兄弟之间不能互相访问

a.xxx.com 和 b.xxx.com 可以读 xxx.com,
但是 a.xxx.com 和 b.xxx.com不能互相读取,
xxx.com 也不能读 a.xxx.com 和 b.xxx.com 的

关于 token 十件必须知道的事

  1. Token 获取到后需要保存起来以便下次使用,可以选择存储在 localstorage /sessionstorage/cookie
  2. Token 是包含有效期的,你必须部署一些逻辑来进行有效期的控制
  3. localstorage /sessionstorage 的跨域限制较 cookie 更为严格,推荐使用 cookie
  4. 在你进行异步请求时,浏览器一般都会发送预检请求(option),后端应对此部署相应的逻辑
  5. 为什么会有 OPTIONS 请求 - 云 + 社区 - 腾讯云
  6. 使用 cookie 可以轻松处理一个文件下载请求,但是 token 一般都是通过 XHR
    方式进行请求的,所以你必须部署额外的逻辑。比如生成一个实时 ticket ,以 ticket 进行访问,然后校验,重定向,最后下载文件。
  7. 处理 XSS 比处理 CSRF 更容易(这一点我实在没看到他是什么个逻辑,大家可以去看看原文)
  8. token 在每次请求时都会被编码到请求中,所以请注意 token 的大小,不要编码过多数据
  9. 如果在 token 中编码敏感信息,请对 token 进行加密
  10. JSON Web Token 可以用于 Oauth2.0 的 Bearer Token 中,赋予 Oauth2.0 无状态的优势

本文转载于 skyArony

### JWT 的定义 JSON Web Token (JWT) 是一种开放标准 (RFC 7519),用于在各方之间以 JSON 对象的形式安全地传输信息。这种信息是经过数字签名的,因此可以被验证和信任[^1]。JWT 可以使用 HMAC 算法或 RSA/ECDSA 的公钥/私钥对进行签名JWT 的结构由三部分组成:头部 (Header)、负载 (Payload) 和签名 (Signature)。这三部分通过点号 (`.`) 进行分隔,形成如下格式: ``` <base64url-encoded-header>.<base64url-encoded-payload>.<signature> ``` #### 工作流程 JWT 的工作流程通常涉及以下几个阶段: 1. **身份验证**:当用户成功登录时,服务器会生成一个 JWT 并将其返回给客户端。 2. **存储**:客户端接收到 JWT 后,通常会将其存储在本地(如浏览器中的 Cookie 或 LocalStorage 中)。 3. **请求附加**:每次客户端向服务器发起请求时,都会将 JWT 添加到 HTTP 请求头中(通常是 `Authorization` 字段),形式为 `Bearer <token>`。 4. **验证与解析**:服务器接收到来自客户端的请求后,会对 JWT 进行解码和验证。如果验证通过,则允许访问受保护的资源;否则拒绝访问。 以下是生成和验证 JWT 的伪代码示例: ```python import jwt # 密钥 SECRET_KEY = 'your_secret_key' # 创建 JWT payload = {'user_id': 123, 'username': 'example_user'} encoded_jwt = jwt.encode(payload, SECRET_KEY, algorithm='HS256') # 验证 JWT try: decoded_payload = jwt.decode(encoded_jwt, SECRET_KEY, algorithms=['HS256']) except jwt.ExpiredSignatureError: print("Token expired.") except jwt.InvalidTokenError: print("Invalid token.") else: print(decoded_payload) ``` ### 使用场景 JWT 主要应用于以下几种场景: 1. **身份认证**:JWT 常用于用户的登录状态管理。一旦用户完成身份验证,服务器会生成一个 JWT 返回给客户端,在后续请求中客户端可以通过该令牌证明自己的身份[^3]。 2. **信息交换**:由于 JWT 是经过签名的,可以在不同系统之间安全地传递信息。例如,在微服务架构中,不同的服务可以通过 JWT 来共享某些可信的数据[^4]。 3. **单点登录 (SSO)**:JWT 特别适合分布式系统的单点登录场景。用户只需在一个地方登录即可获得多个相关联的服务访问权限。 ### 总结 JWT 提供了一种轻量级的安全机制,能够在网络环境中高效地传递信息。其核心价值在于能够减少服务器端的状态维护需求,同时提高通信效率和安全性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值