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

基于token的登录认证 #13

Open
Alexandermclean opened this issue Mar 16, 2019 · 0 comments
Open

基于token的登录认证 #13

Alexandermclean opened this issue Mar 16, 2019 · 0 comments

Comments

@Alexandermclean
Copy link
Owner

主要从sessions、cookies和token来说

1.基于token的会话验证:

用户登录系统后与服务器建立起会话,为了保持会话避免重复登录,因此浏览器登录第一次后需要一个可以证明自己身份的东西,让服务器知道这是一个曾经登录过的用户并且知道是谁,从而响应对应用户的请求;由于HTTP请求是无状态的,因此区分每一个用户是一个不小的困难。
在介绍基于token的身份验证之前,可以想到要解决这个问题,用户第一次登录后,服务器回应用户一个会话ID就,用户请求时带上这个ID,服务器检索到这个ID对应的是谁,就可以回应正确的请求了;这对于少量用户群体来说还行,但对于用户量过多的系统,服务器存储的压力就太大了,而且基于负载均衡的服务器集群不能保证一个用户的每次请求都在第一台保存用户ID的服务器上。
所以这个ID不应该让服务器存,但如果不存的话服务器又不知道请求的是不是合法的用户。
基于token的身份验证:用户第一次登陆后,服务器生成一个由user_id和签名(用服务器秘钥加密后的user_id),二者组合成一个token(令牌)发给浏览器。

token1

之后的每次请求浏览器把token带着,每次服务器解密token里的签名对比明文的user_id,一致的话就可以知道用户是谁了,避免了服务器存储session_id的压力。

token2

2.cookie

cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。

cookie由服务器生成,发送给浏览器,浏览器把cookie以kv的形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。

3.session

session 从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长相等)表明他就是张三。

session 也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用 cookie 的方式。

服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候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