谈谈web项目中的凭证的存储与处理

190 阅读2分钟

凭证或token,是一种认证机制,相当于一把钥匙,能打开特定的锁进入对应的门,这相当于增加了一层保护机制,过滤掉那些不合理的操作。

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

首先介绍下web项目中的一些token或认证类型,再简单举例在React项目中的使用。

什么是认证

还记得大学时期,第一次购物的场景激动的不得了,当时有个叫网盾的东西(建设银行的),usb连上电脑,通过认证才可支付,俗称网银盾。这个盾就提供了一层防护机制,只有环境安全了,才完成支付,就是一种认证。后来支付宝微信等二维码支付的流行也使网银盾,渐渐无人问津退出了主流。

玩过早期的梦幻西游的玩家都知道,梦幻西游在2006年代是相当火爆的,游戏的受欢迎决定账户潜在遭受攻击盗号风险的上升,于是网易出了个游戏令牌,该令牌一经激活就会开启周期性的登录密码随机生成模式。也是一种认证,只不过认证放到了服务端。

web项目里凭证也是同样的道理:

  • 登录请求至服务端,认证通过后获取token
  • 每次request携带该token至服务端

我们这里主要讨论凭证的存储与消费

凭证的分类

拿到Token后需要存储在客户端 客户端的三种存储模式:

  • cookie 老牌存储机制,特点是可以装载至request header里发送,可以设置过期时间。
  • sessionStorage 相当于浏览器的一个tab,tab关闭存储即消失,特点是方便,无需关注过期时间。
  • localStorage 永久存储,没有过期时间,除非手动删除。

我们采用cookie存储,一方面凭证都有时效性,另一方面需要便携性,cookie天然具备这样的特性。

客户端和服务端都能写入cookie,区别是哪一方控制时效的问题。

凭证的检查

///user-ready.js
import User from '@/ajax/user'
function ReadyOrNot(){
	return new Promise((res,rej)=>{
                ///localStorage\Cookie皆可
		let userInfo = localStorage.getItem('userInfo');
		if(userInfo !== null){
			//依赖凭证有存储
			res(userInfo)
		}else{
			User.getUserInfo().then(res=>{
				if(res.statusCode === 200){
					//写入sessionStorage
					localStorage.setItem('userInfo',res.userInfo);
					res(res.userInfo)
				}
			})
		}
	})
}

//other.js
import Ready from './user-ready.js'
Ready().then(res => {
	//拿到凭证数据,再请求下一个数据信息
})

最后

感谢阅读,谢谢!