利用Redis集群构建安全的JWT体系(redis集群jwt)
在当今的Web应用开发过程中,基于JSON Web令牌(JWT)的认证方案已经被证明是使用非常广泛的安全认证方案。但是,JWT体系并不支持传统客户端-服务器架构中的最终一致性:无论什么时候,如果要更新自定义令牌,所有客户端都必须同时更新以确保可用性。
要解决这个问题,需要使用一些有记忆功能的持久存储,以安全地跟踪JWT令牌正在使用的状态,并确保可以确定正确更新状态以及无效令牌的及时淘汰。
这里我们就用Redis作为这个有记忆功能的持久存储,搭建一个安全的JWT体系。Redis(REmote DIctionary Server)是一个高性能的,开源的内存数据存储系统,它提供了高度可扩展性和卓越的性能。回到我们的JWT体系,可以通过Redis实现逻辑简单而高性能的JWT认证模式。
要构建JWT认证系统,我们首先需要构建基于Redis的令牌存储模型。对于每个令牌,可以使用唯一的key来储存它,并且为了确保命中的令牌是正确的,可以在储存的key的value值中加入一个除了时间戳的令牌签名信息,这样就可以确认令牌发布者的身份了。
下面我们就通过代码来构建一个基于Redis的JWT令牌系统:
//generates a JWT Token
function generateToken() { //generate a random string
let token = Math.random().toString(36).substr(2)
//store token in Redis let redisClient = new Redis({
host: 'localhost', port: 6379
}); redisClient.set(token, Date.now().toString(), (err, reply) => {
console.log(reply.toString()); });
return token;}
//validates a JWT Token
function validateToken(token) { //query Redis for the token
let redisClient = new Redis({ host: 'localhost',
port: 6379 });
let timestamp = redisClient.get(token); if (timestamp == null)
return false;
//check if token is valid let now = Date.now();
if (Math.abs(now - timestamp) return true;
return false;
}
由于Redis的特性,不管是存储或是安全验证都可以很方便的实现,Redis强大的高可用性也可以保证令牌安全状态的可用性,所以如果要在当今的Web应用中构建一个安全的JWT认证系统,Redis 是最好的选择。