在《简单理解cookie/session机制》一文中,简要说明了cookie和session的原理。本文将简要解释另一个与cookie/session同样重要的技术术语:token。
什么是tokenToken的意思是“令牌”,是服务器生成的一串字符串,作为客户端请求的标识。
当用户第一次登录时,服务器生成一个令牌并将其返回给客户端。以后客户端只需要带这个令牌来请求数据,不用再带用户名和密码了。
简单令牌的组成;Uid(用户的唯一标识),time(当前时间的时间戳),sign(签名),token的前几个数字通过hash算法压缩成一定长度的十六进制字符串。以防止令牌泄漏)。
身份认证概述由于HTTP是一个无状态协议,它不知道谁访问了我们的应用程序。在这里,用户被视为客户端,客户端使用用户名和密码通过了身份验证,但下一次这个客户端发送请求时,必须再次进行验证。
一般的解决方案是,当用户请求登录时,如果没有问题,在服务器上生成一条记录,在记录中可以写明登录的用户,然后将这条记录的id发送给客户端。客户端收到后,id被存储在一个cookie中,下次用户向服务器发送请求时,可以带上这个cookie,这样服务器就会验证cookie中的信息。看看能不能在服务器上找到对应的记录。如果是,说明用户通过了认证,用户请求的数据会返回给客户端。
上面描述的过程就是使用session,那个id值就是sessionid。我们需要将为用户生成的会话存储在服务器上,这些会话将存储在内存、磁盘或数据库中。
基于token机制的身份认证采用令牌机制的认证方式,不需要在服务器端存储用户的登录记录。大致过程:
A.使用设备的mac地址作为令牌
客户端:客户端在登录时获取设备的mac地址,并作为参数传输给服务器。
服务器:收到这个参数后,服务器会用一个变量接收,在数据库中保存为令牌,在会话中设置令牌。客户端每次请求都要统一拦截令牌,将客户端传递的令牌与服务器会话中的令牌进行比较。如果令牌相同,登录将成功,但如果令牌不同,将被拒绝。
这样,客户端和服务器统一了唯一标识,保证了每台设备都有唯一标识。缺点是服务器需要保存mac地址;好处是客户端不需要再次登录,登录一次就可以一直使用,超时的问题由服务器处理。
B.使用sessionid作为令牌
客户端:客户端使用用户名和密码登录。
服务器:收到用户名和密码后,检查一下。如果正确,本地获取的sessionid将作为令牌返回给客户端。客户端只需要在将来带来所请求的数据。
这种方法的优点是方便,不需要存储数据。缺点是当会话过期时,客户端必须再次登录以请求数据。
当然,对于一些保密性较高的应用,可以使用设备的mac地址和用户名密码作为令牌进行认证。
APP利用token机制进行身份认证当用户登录APP时,APP会将加密的用户名和密码发送给服务器,服务器会对用户名和密码进行验证。如果验证成功,它将生成相应数量的字符作为令牌存储在服务器中,并将令牌返回给APP。
以后APP再次请求时,需要验证的地方就取令牌,然后服务器端验证令牌,成功返回所需结果,失败则返回错误信息,让用户重新登录。其中,服务器会为令牌设置一个截止日期,并在每次APP请求时验证令牌和截止日期。
token的存储Token可以存储在数据库中,但是查询token的时间可能太长,导致token丢失(其实token一旦丢失重新认证是好的,但是不要丢失太频繁,没事的时候也不要让用户认证)。
为了避免过长的查询时间,可以将令牌放在内存中。这样查询速度肯定不是问题,也不用太担心占用内存。即使令牌是32位字符串,应用的用户数在百万或千万,也不会占用太多内存。
token的加密Token容易泄露。如果不加密,很容易被恶意复制用来登录。加密方法通常包括:
还有一点,在网络层使用明文传输令牌是非常危险的,所以必须使用HTTPS协议。
总结以上是对用户认证过程中token的简单总结。希望没有技术背景的产品经理在和开发兄弟交流时,不要被这些技术术语缠住。