每日八股文6.12
每日八股-6.12
- 计算机网络
- 1.当我们在浏览器中输入一个 URL 并按下回车后,到页面最终显示出来,这中间都发生了哪些关键步骤?
- 2.请简述一下 JWT(JSON Web Tokens)的原理和校验机制
计算机网络
1.当我们在浏览器中输入一个 URL 并按下回车后,到页面最终显示出来,这中间都发生了哪些关键步骤?
Redis 在很多业务场景中都有广泛的应用,我列举一些比较常用的:
- 热点数据缓存: 这是 Redis 最常见的应用场景。由于 Redis 速度快,非常适合存储访问频率很高的数据,比如商品信息、用户信息、配置信息等等。
- 限时类业务的实现: Redis 提供了 expire 命令可以设置 key 的过期时间,这非常适合实现一些限时业务,比如验证码的有效期、优惠券的使用期限、活动倒计时等等。
- 计数器的实现: Redis 的 incrby 等命令可以实现原子性的递增操作,在高并发场景下非常有用,比如可以用来做秒杀活动的计数、限制某个接口的访问频率等等。
- 排行榜的实现: Redis 的有序集合(SortedSet)可以根据分数进行排序,非常适合实现各种排行榜功能,比如热门商品排行榜、用户积分排行榜等等。
- 分布式锁的实现: 可以利用 Redis 的 setnx(set if not exists)命令来实现简单的分布式锁,保证在分布式环境下只有一个客户端能执行特定的操作。
2.请简述一下 JWT(JSON Web Tokens)的原理和校验机制
JWT的全称是JSON WEB TOKENS,是一种基于Json的开放标准,一个JWT由三个部分构成
-
头部(header)
头部包括两个字段,第一个字段是alg,也就是指明我们的加密算法,分为对称算法和非对称算法两种,对称算法用到的一般是HS256,非对称算法一般用到的是RS256;第二个字段是typ,这是一个固定值JWT,用来表示他是一个jwt token。头部会使用base64 url来进行编码,并进行加密
-
负载(payload)
负载主要存储的是实际信息,包括用户登录信息,过期时间等等,他也需要用base64 url来进行编码,但是他不会加密,所以说我们不能将任何敏感的数据存放在负载里。
-
签名(signature)
签名是服务器用来验证客户端传来的jwt的完整性和真实性,它等于alg(解密后的头部+“.”+解密后的负载+secret)
校验机制是这样的:客户端发来一个jwt token,服务器端用头部中的算法计算base64 url解密后的头部加上base64 url解密后的负载加上服务器端的密钥,看是否用jwt token中的签名一致,如果一致,说明没有被篡改,可以进行后续的操作。
补充Refresh Token
为什么需要Refresh Token?
- Access Token,即jwt,在客户端请求服务器时,会频繁的暴露在网络传输中,极有可能会被窃取,如果说jwt token设置的过期时间很长,那么对用户会造成损失
- 如果jwt token设置的过期时间很短,比如说15分钟,那么用户在使用服务的时候,每隔十五分钟就需要重新输入一次密码,这对于用户的体验感是极差的
所以说,我们在Access Token的基础上,引入了Refresh Token,它解决了上面两个问题,首先,Access Token通常存储在内存中,而Refresh Token一般存在cookie上,这保证了安全性,另外最重要的是我们引入Refresh Token来刷新Access Token的这一过程,对用户是无感的,也就是用户不会察觉到。
Access Token (访问令牌):就像是你酒店房间的房卡。它的有效期很短(比如 15 分钟到 1 小时),你每次进房间(访问受保护的 API)都需要出示它。它直接暴露给各种服务,风险较高。
Refresh Token (刷新令牌):就像是你办理入住时拿到的入住凭证。它的有效期很长(比如 7 天或 30 天),你平时都把它妥善保管起来,不会轻易示人。它的唯一作用就是,当你的房卡(Access Token)过期失效时,你可以拿着这个凭证去前台(特定的刷新接口),换一张新的房卡。
所以,Refresh Token 本身并不用于访问业务 API,它唯一的作用就是用来获取新的 Access Token。