Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

session、token和cookie #5

Open
wangmeijian opened this issue Mar 28, 2021 · 0 comments
Open

session、token和cookie #5

wangmeijian opened this issue Mar 28, 2021 · 0 comments

Comments

@wangmeijian
Copy link
Owner

session、token和cookie

HTTP是无状态的,什么叫无状态?意思是HTTP不会记住用户,即使你刚刚才使用账号密码登录过系统,下一次请求,还得再次校验你的身份。

常用做身份校验的方式有session和token,他们有各自的优缺点,可能有人质疑说还有cookie,cookie只是用来存储数据的载体。

session认证机制

认证流程:

  • 用户使用账号密码登录服务器
  • 服务器生成一个session对象和与之对应的sessionid,用来记录用户的会话信息,并将sessionid返回给浏览器,浏览器可以使用cookie、localStorage或sessionStorage存储
  • 浏览器下次向服务器发起请求,带上sessionid
  • 服务器收到sessionid,查看是否存在与之对应的session对象,如果有,认证成功并返回数据,如果没有则要求重新登录

session对象存储在服务器端,客户端登录以后,每次请求只需带上sessionid即可完成身份认证。但是,当服务器采用分布式或集群时,用户在服务器A登录,下次请求到了另一台服务器B,就得重新登录,这是无法接受的,解决方式有以下几种:

  • session保持:保证每个客户固定地访问同一台服务器
  • session复制:将所有session对象复制到所有服务器
  • session共享:把所有session放到同一台服务器

不管哪一种,都得付出额外的成本,并且,随着用户量增大,服务器将创建大量的session对象,对服务器来说是个负担。

token认证机制

认证流程:

  • 用户使用账号密码登录服务器
  • 服务器用特定的算法生成一个签名的token返回给客户端
  • 客户端存储token,后续每次请求都带上token
  • 服务器验证token并返回数据

和session认证不同的是,token认证机制不需要在服务器端存储任何东西,这一点来说,服务器压力不会随着用户量增加而增大。

cookie

cookie不是一种认证机制,它和localStorage以及sessionStorage才是同类,由于每次HTTP请求都会自动带上cookie,它常常被用来存储用户认证相关数据。也正是因为每次HTTP请求都会自动带上cookie,才有了CSRF问题,要解决CSRF也很简单,不要把用户认证信息存在cookie。

总结

session像花名册,每次访问服务器都要查找该客户端是否登记在册;
token像密文,每次访问服务器,服务端都要采用特定的算法校验token是否有效;
相对session来说,token是利用服务器CPU的计算时间来换取服务器存储session对象的空间。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant