解决服务器并发使用负载均衡。
可以做负载均衡的有很多:nginx、apache、tomcat。现在都用Spring Cloud LoadBalancer。
负载均衡涉及到一个session共享问题。你一个服务器有session,一个没有肯定有问题。可以用cookie来做。session存在服务器端,会占用服务器内存,必定会影响服务器硬盘的读写性能。cookie存储在客户端是存在客户的电脑里,如果清cookie就有问题了,还可以用token来做。
JWT Token
JWT是一种流行的跨域认证解决方案。它将用户信息加密到Token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。
JWT Token包含三部分:
Header(头部):包含算法信息和JWT类型。例如:{“alg":“HS256”,“type”,"JWT}
{ Typ=“jwt”———类型为jwt Alg:“HS256”—–加密算法为hs256 }
Playload(负载/有效载荷):存储了有关用户身份和其它元数据的信息(用户唯一标识、角色)。
例如:{“userId”:“1”,“username”:“mayikt”}
iss: jwt签发者 sub: jwt所面向的用户 aud: 接收jwt的一方 exp: jwt的过期时间,这个过期时间必须要大于签发时间 nbf: 定义在什么时间之前,该jwt都是不可用的. iat: jwt的签发时间 jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
Signature(签名):通过使用密钥对前面两部分进行哈希计算。
这段是签证信息,非常非常关键的部分。 这关乎你的这个 Token 是否安全,是否能被人仿造。 一般是对 header (base64后的) 和 payload (base64后的) 这两部分的数据通过 secret(私钥)进行签名后的结果。所以这个签名算法就非常关键了,常用的有 SHA256 和 HMAC,个人更推荐使用 RSA。
JWT续签,双Token机制:
访问令牌(Access Token):一般存储时间短(30分钟或者一个小时),存储在客户端避免长期存储
刷新令牌(Refresh Token):一般存储时间长(7天或者10天),存储在更安全的位置,如HTTP-only的Cookie,减少被恶意脚本访问的风险。
刷新令牌的有效期长,访问令牌的有效期短。刷新令牌是用来刷新访问令牌的。登录后,服务器会一次性生成刷新令牌和访问令牌两个Token。访问令牌用户访问受保护的资源的钥匙。刷新令牌是在访问令牌过期后获取新的访问令牌。
双Token的工作流程:
- 用户提供凭证(如用户名和密码)进行身份验证。
- 服务器生成一个访问令牌和一个刷新令牌,返回给客户端。
- 客户端在每次请求中携带访问令牌。
- 服务器验证访问令牌的有效性,允许或拒绝访问。
- 如果访问接口,access_token过期,返回401错误码
- 拿到refresh_token去访问后台接口
- 先查数据库,如果refresh_token不存在,报错:刷新令牌不存在
- 校验refresh_token是否过期,是->提示:token已过期
- refresh_token没有过期,向授权服务器发送刷新令牌请求:
- 请求参数
- { grant_type=“refresh_token表示使用刷新令牌获取新的访问令牌” refresh_token:“客户端传来的” }
- 返回参数
- { access_token=“新的访问令牌” refresh_token:“新的刷新令牌” }
- 拿到新的访问令牌,返回给客户端。客户端再次发送包含新的访问令牌的请求,这就实现了访问令牌的自动续期。
刷新令牌被盗用:
(1)、要用授权服务器的监控机制和撤销令牌机制来保证安全
(2)、限制刷新令牌的使用次数,使用一次,就更换新的刷新令
我们把所有信息都存储在token中吗?
不建议将所有信息都存储在jwt中。jwt主要用于存储必要的身份验证和授权信息,以确保每次请求都能识别和验证用户身份。
JWT一定安全吗?
JWT并不是绝对安全的,安全性取决于其使用方法和环境配置
1、使用强加密和签名算法:HS256和RS256
2、安全存储密钥
3、短期有效性
4、HTTPS传输,防止中间攻击
5、方式重放攻击:可以引入jti(JWT JTI)和iat(ISSUED AT)等声明,并在服务器端维护已使用的令牌,防止重放攻击
6、保护JWT:防止被盗用的措施包括使用短期令牌和刷新令牌,撤销机制,绑定IP和user-agent以及加密敏感数据
为什么现在做负载均衡都不用nignx了?
以前做负载均衡用你滚下做,现在都用spring cloud的负载均衡组件,说白了就是不需要运维了,开发人员也能做负载均衡,降低了学习成本,要不你还得学nginx、Linux啥的
Nginx介绍:
Nginx是一款轻量级的web服务器。反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
特点:
占用内存少、并发能力强
Nginx的并发能力是在同类型的网页服务器中表现比较好,并发能力50000
Nginx支持哪些类型的反向代理?
1、基于七层对的Http/Https/mail等应用协议的代理
2、基于四层的ip+tcp/udp端口的代理
Nginx的反向代理
Server{
listen 82;
server_name localhost;
location /{
#代理服务器地址
proxy_pass Http://192.168.111.132:8080;
}
}
Nginx动静分离:
动:动态资源(接口)
静:静态资源(css、js、image)
分离:之前静态资源和动态资源放在Web服务器下,现在把静态资源放入Nginx服务器下(/nginx/static/css或者image/js),动态资源放在web服务器下
Server{
listen 84;
server_name localhost;
location /{proxy_pass Http://qy174}
location ~\\.js|.css|.jpg|.png|.jpeg|.ico|.mp3|.mp4|.avi{
root static;
}
}
Nginx的负载均衡:
1、默认负载均衡:
定义集群名称
upstream qy174{
#真实web服务器集群的信息
server 192.168.111.132:8081;
server 192.168.111.132:8082;
}
Server {
listen 83;
servername localhost;
location /{
proxy_pass Http://qy174;
}
}
2、权重负载均衡
#权重越大,访问频率越高
upstream qy174{
server 192.168.111.132:8081 weight=3;
server 192.168.111.132:8082 weight=1;
}
Server{
listen 83;
servername localhost;
location /{
proxy_pass Http://qy174;
}
}
3、ip_hash策略
根据访问者客户的IP,固定访问对应的Web服务器
upstream qy174{
server 192.168.111.132:8081;
server 192.168.111.132:8082;
ip_hash;
}
Server{
listen 83;
servername localhost;
location /{
proxy_pass Http://qy174;
}
}
评论前必须登录!
注册