记录一下工作中学到的东西。
1、什么是Token?
Token,也称为“令牌”,是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
形式例如:39faf62271944fe48c4f1d69be71bc9a
举个生活中的例子,来通俗说明一下。
大家肯定都去过ktv,你在收银台交过钱后,一般会在你的手上盖个戳,然后你去唱歌,唱到一半的时候,突然想起自己的车好像没锁!你心急火燎的跑出去锁车,但回来的时候被保安大哥拦下:交钱了没哥们?这时你出示一下手上的印戳,保安大哥查验后就让你顺利通过了。
这个戳就是token令牌,代表你交过钱了;而保安大哥的查验就是鉴权。
2、为什么使用Token?
传统验证用户身份的方式,大多为基于服务器验证的方式,即cookie+session的方式,由于HTTP协议是无状态的,导致程序需要验证每一次请求,从而辨别客户端的身份。
用户登录成功将其信息存入session中,用户每次请求都会将携带session id的cookie一起发送器服务端,进行校验,随着Web、应用程序、以及移动端的崛起,这种验证方式弊端逐渐显现,尤其是在可扩展性方面。
引发的问题比如用户增多导致内存开销较大、CORS(跨域资源共享)以及CSRF(跨站请求伪造)等。
引入Token验证机制后,请求会发送token而不再是发送cookie能有效够防止CSRF,即使在客户端使用cookie存储token,但cookie也只有存储功能,而不再具备验证功能,因此安全性得到了极大的提高。
而且只要token设计的足够复杂,除非用户泄露,否则几乎没有被破解的可能,加上token是有时效的,在有限的时间加上有限的算力,更是无懈可击,这也类似于加密资产比如比特币钱包对应的私钥,安全性极高。
另外Token可以有效减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。
3、基于Token的身份验证流程
-
客户端(登录页面)使用用户名跟密码请求登录,通过ajax提交到后台。
-
服务端(后台)收到请求(用户名、密码),去数据库验证用户名与密码。
-
验证成功后,服务端对用户名和密码等敏感信息进行JWT加密,签发一个 Token,再把这个 Token 发送给客户端。
-
客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里。
-
客户端每次向服务端请求资源的时候需要带着服务端签发的 Token。
-
服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。
最后说明一下,以上这些理论知识都有所借鉴,为了让自己更好的学习!