Token
Token产生的背景?
在客户端与服务端的交互过程中,客户端频繁地向服务端请求数据,服务端频繁地去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,但是如果总是需要对比用户名和密码,会在一定程度上加大安全问题的隐患,并且频繁的调用数据库,会造成资源的浪费,让程序运行效率变慢,在这样的背景下,Token便应运而生。
Token是什么?
Token在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。在开发中,Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
Token的作用?
- 使用Token,我们并不需要频繁调用查询数据库,所以使用Token能减轻服务器的压力;
- 使用Token,我们不需要频繁传输用户的账号和密码,所以使用Token在一定程度上可以避免出现一些安全问题;
生成Token的方法有哪些?
-
用设备号/设备mac地址作为Token(推荐)
客户端:客户端在登录的时候获取设备的设备号/mac地址,并将其作为参数传递到服务端。
服务端:服务端接收到该参数后,便用一个变量来接收同时将其作为Token保存在数据库,并将该Token设置到session中,客户端每次请求的时候都要统一拦截,并将客户端传递的token和服务器端session中的token进行对比,如果相同则放行,不同则拒绝。
分析:客户端和服务器端就统一了一个唯一的标识Token,而且保证了每一个设备拥有了一个唯一的会话。该方法的缺点是客户端需要带设备号/mac地址作为参数传递,而且服务器端还需要保存;优点是客户端不需重新登录,只要登录一次以后一直可以使用,至于超时的问题是由服务器这边来处理,如何处理?若服务器保存的Token超时后,服务器只需将客户端传递的Token向数据库中查询,同时并赋值给变量Token,如此,Token的超时又重新计时。
-
用sessionID值作为Token
客户端:客户端只需要使用用户名和密码登录即可。
服务端:服务端收到客户端提交的用户名和密码做判断,如果正确就将本地获取的sessionID作为Token返回给客户端,因为客户端再次请求的时候会带上sessionID,所以客户端以后只需要带上数据请求即可。
分析:sessionID是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。tomcat生成的sessionID叫做jsessionid,session在访问tomcat服务器HttpServletRequest的getSession(true)的时候创建,tomcat的ManagerBase类提供创建sessionID的方法:随机数+时间+jvmid;;该方法的缺点在于,当session过期后,客户端必须重新登录才能访问数据;优点是不需要存储数据。
-
用自己设定的算法去创建Token,比如使用:
- 用户名_UUID作为Token;
- JWT(json web token)标准去生成Token;
- 第三方工具类如:jjwt-0.9.0.jar生成Token;
客户端:客户端使用用户名和密码登录,根据不同的Token生成算法提供不同的数据信息。
服务端:服务端收到客户端提交的用户名和密码做判断,如果正确就将客户端提供的信息通过自己设定的算法生成Token。
分析:由于生成Token的方法不同,获取数据生成Token、验证Token的方式也不同,对于生成Token算法比较复杂的情况,可能会在生成Token的时候消耗很多资源,但是由于算法复杂,Token不容易被破解;不同的算法,需要的数据也不同,这一点也会造成安全性、运行效率的区别。
验证Token的注意事项?
在验证Token的时候我们需要考虑到以下几个方面:
- 根据生成Token的算法,去找到验证Token的方法;
- 由于存放Token的位置不同,验证的方式会不一样;
- 如果用到了Session,需要考虑Session的有效期;
- 如果用到了缓存数据库,需要考虑Token的有效期;
使用Token的基本流程
Token的基本流程大概是这样的:
- 客户端使用用户名跟密码请求登录;
- 服务端收到请求,去验证用户名与密码;
- 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端;
- 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里;
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token;
- 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。