Token的生成、Token的作用及Base编码的注意事项

Token的生成方式或常见样式有:

  • 随机字符串(UUID)
  • 按照JWT标准生成(按一定标准生成加密串)
  • 直接将相关信息做加密
  • SpringSecurity生成:在过滤器中过滤请求,生成或校验Token,默认用UUID生成,并将Token存于Cookie或Session中

Token常见作用:

  • 防止表单重复提交,保证请求的幂等性:

处理一个请求,将其Token存入“已处理请求”中,再次进来的请求,如果其Token已在“已处理请求中”,则不再重复处理(该Token需要尽量保证全局唯一)

  • CSRF防御:

Token由服务端返回,将Token存入Cookie或者Session中,并存入到返回的html中表单的hidden字段中,等提交表单时,服务端对比表单提交的请求参数中的token与cookie或session中存储的token是否一致。

场景:服务端收到访问/login页面请求时

  1. 先检查Cookie或Session中是否已经存在Token,存在则直接将该Token存入返回的html表单中;不存在则通过SpringSecurity生成(其他方式生成也行),将Token存入Cookie或Session中,并将该Token存入返回的html表单中
  2. 浏览器显示/login的页面
  3. 在/login中提交表单,会把隐藏字段中的Token一并提交
  4. 服务端校验请求参数中的Token与Cookie或Session中存储的Token是否一致

Token是动态变化的,CSRF的表单无法确定当前的Token是什么,也就无法提前准备请求参数,一定程度上实现了CSRF的防御。

  • 单点登录(SSO)

初次登陆,服务端按照指定字段生成Token(直接加密,或者用JWT标准加密都行),并返回,下次访问时请求中带上指定字段和Token,服务端将Token解密,如果解密结果与请求中携带的指定字段一致,则允许访问。(此Token存于请求头中,因此跨域访问也会生效,如果存在Cookie中,跨域访问Cookie会失效)

以加密方式生成Token的好处:

分布式中,每个服务端存储加密算法及密钥即可,无需通过Session存储,减轻服务端压力。

使用加密算法的注意点:

无论是JWT标准中的加密,还是用AES或者3DES等加密算法,加密后都需要用base32,或者base64编码,同理解密前,也要先用base解码,再解密。

因为,加密后的字符串有很多计算机无法显示的乱码,通过url返回时,甚至后续如果要将加密串存入数据库,这些计算机无法识别的字符都有可能出现问题,因此需要用base编码。

同时也要注意,用base64编码时,主要base64中的‘+’、‘/’及最后自动生成的占位符‘=’,这些都是在url中的特殊字符,在存入url时会产生异议,因此需要做额外的特殊处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyc头发还挺多的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值