这是一个JWT令牌的样例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
在我们访问某个网站时,在未登录这个网站的情况,我们访问里面的资源会直接提示我们到登录页面去登录账号,只有登录了账号才能正常浏览网站里面的内容。
我们知道JWT令牌是由三个部分组成,分别以"."隔开,第一个部分(Header头部)描述了令牌的元数据,如使用的签名算法等。第二个部分(Payload负载)包含了所谓的Claims(声明),即关于实体(通常是用户)和其他数据的声明。第三个部分(Signature签名)用于验证消息在传输过程中未被篡改,并且,对于使用私钥签名的令牌,可以验证发送者的身份。
JWT(JSON Web Token)本身不直接使用私钥,而是使用对称密钥(secret key)或非对称加密中的公钥/私钥对。在JWT的使用中,"私钥"通常指的是非对称加密算法中的私有部分,用于签名JWT并保证其安全性。
对称密钥(Secret Key):
在大多数情况下,JWT使用对称密钥进行签名和验证。这意味着同一个密钥既用于生成JWT时的签名,也用于验证JWT的签名。
对称密钥应该是保密的,不应该泄露给客户端或其他不可信的第三方。
非对称加密(公钥/私钥对):
在某些情况下,可以使用非对称加密算法(如RS256)来签署JWT。这种情况下,私钥用于生成JWT的签名,而公钥用于验证签名。
私钥必须保密,只有服务器或授权的服务能够访问。
公钥可以公开,任何人都可以用它来验证JWT的签名。
使用私钥签名JWT的步骤:
- 生成密钥对:使用非对称加密算法生成一对公钥和私钥。
- 使用私钥签名:使用私钥对JWT的头部和负载进行签名,生成签名部分。
- 发送JWT:将JWT发送给客户端。
- 验证JWT:客户端或服务端使用公钥来验证JWT的签名。
由此不知道大家是否有这样一个问题?
假如我登录了某个网站,这个网站是有登录认证功能的,登录认证是基于JWT令牌技术实现的,那么我有个疑问,我在第一次登录完这个网站后,我获得了一个令牌,然后我退出这个网站,那么我下次直接将这个网站里面的一个子网页路径复制下来,我直接去访问,由于我的请求是携带了上次的令牌的,这个时候我不应该可以直接访问到吗?为什么系统直接把我回退到了登录页面让我重新登陆?
这是因为JWT存在时间戳机制
- 令牌过期:JWT令牌通常包含一个过期时间(exp),这是令牌有效期限的截止点。如果你在退出网站后一段时间再次使用相同的令牌,可能已经超出了这个过期时间,因此服务器会拒绝这个过期的令牌,要求你重新登录。
- 令牌存储问题:如果你在退出网站时清除了浏览器的存储(如LocalStorage、SessionStorage或Cookies),那么即使令牌原本没有过期,你的浏览器也无法再发送这个令牌,因此服务器会认为你没有进行身份验证。
- 会话管理:有些系统可能会在用户显式登出时采取额外的措施,比如使当前的令牌失效或标记用户的会话结束。这样,即使令牌本身没有过期,服务器上的状态也表明用户已经不再处于登录状态。
- 令牌刷新机制:有些应用实现了令牌刷新机制,即在令牌接近过期时自动获取新的令牌。如果刷新机制失败或没有实现,旧的令牌可能就不再被接受。
这是我在学习token知识过程中的疑问以及解决我的疑惑的一些方法,希望可以帮助到大家