「etcd」- TokenProvider

问题描述

身份验证这个过程开销极其昂贵,需要避免频繁、昂贵的密码计算匹配,提升密码认证的性能;

解决方案

当 etcd server 验证用户密码成功后,它就会返回一个 Token 字符串给 client,用于表示用户的身份。后续请求携带此 Token,就无需再次进行密码校验,实现了通信证的效果;

原理简述

etcd 目前支持两种 Token,分别为 Simple Token 和 JWT Token;

Simple Token

其核心原理是:
1)当一个用户身份验证通过后,生成一个随机的字符串值 Token 返回给 client,并在内存中使用 map 存储用户和 Token 映射关系;
2)当收到用户的请求时, etcd 会从请求中获取 Token 值,转换成对应的用户名信息,返回给下层模块使用;

Token 是身份的象征,若此 Token 泄露了,那你的数据就可能存在泄露的风险。etcd 生成的每个 Token,都有个过期时间 TTL 属性,Token 过期后 client 需再次验证身份,因此可显著缩小数据泄露的时间窗口,在性能上、安全性上实现平衡;

在 etcd v3.4.9 版本中,Token 默认有效期是 5min,etcd server 会定时检查 Token 是否过期,若过期则从 map 数据结构中删除此 Token;

已知问题:
1)它是有状态的,etcd server 需要使用内存存储 Token 和用户名的映射关系;
2)可描述性很弱(Simple Token 字符串本身并未含任何有价值信息),client 无法通过 Token 获取到过期时间、用户名、签发者等信息。因此 client 无法及时、准确获取到 Token 过期时间,所以 client 不容易提前去规避因 Token 失效导致的请求报错;

JWT Token

JWT 是 Json Web Token 缩写, 它是一个基于 JSON 的开放标准(RFC 7519)定义的一种紧凑、独立的格式,可用于在身份提供者和服务提供者间,传递被认证的用户身份信息;

它由 Header、Payload、Signature 三个对象组成, 每个对象都是一个 JSON 结构体:
1)Header,其包含 alg 和 typ 两个字段:alg 表示签名的算法,etcd 支持 RSA、ESA、PS 系列;typ 表示类型就是 JWT;
2)Payload,它表示载荷,包含用户名、过期时间等信息,可以自定义添加字段;
3)Signature = RSA256(base64UrlEncode(header) + “.” +base64UrlEncode(payload),RSA-Private-Key)

特性特征:
1)无状态的。JWT Token 自带用户名、版本号、过期时间等描述信息,etcd server 不需要保存它,client 可方便、高效的获取到 Token 的过期时间、用户名等信息;
2)它解决 Simple Token 的若干不足之处,安全性更高,

etcd 社区建议大家在生产环境若使用了密码认证,应使用 JWT Token( –auth-token ‘jwt’),而不是默认的 Simple Token;