zlx362211854 / daily-study

每日一个知识点总结,以issue的形式体现
10 stars 6 forks source link

19. Cookie,Session,Token #39

Open goldEli opened 5 years ago

goldEli commented 5 years ago

说说对 Cookie,Session,Token 的理解。

goldEli commented 5 years ago

一个有登录验证的网站,需要在有效时间内保存用户的登录状态,不然用户需要频繁验证密码。

可以用 Session 保存用户的登录信息。

Session

用户登录验证成功后,服务器端返回一个字符串,接下浏览器发起的所有请求会带上这个字符串,服务器校验这个字符串,就能判断用户是否已登陆过。

Session 有两个问题:

  1. 如果有一亿人访问这个网站,那么网站就需要存一亿个 Session,储存,搜索都是巨大的开销。
  2. 如果服务端采用了负载均衡,用户A 访问了服务器1,并将 session 储存到服务器1,但之后的请求被随机到了服务器2,那么 session 就找不到了,即使 session 与服务器1关联,但服务器1挂了呢?

所以可不可以不存 Session 呢?

Token

当用户验证成功后,服务器把用户的基本信息用秘钥生成一个字符串,然后把字符串和用户基本信息发给用户,用户下次请求会带上这个字符串和用户基本信息,服务器再用秘钥解密这个字符串,得到用户的基本信息后进行比对,如果相等则校验通过,反之则需要重新登录。

Token 很好的解决 Session 需要存储的问题,是目前最主流的验证方式。

Cookie

不管是采用 Seesion 还是 Token,浏览器都需要存一些服务器要求存的东西,这种储存方式就叫 CookieCookie由服务端生成,key value 的方式存在。为了不占用太大的空间,每个域下面的 cookie 都有所限制。

zlx362211854 commented 5 years ago

session和token都是服务器用来验证请求合法性的手段。 session

  1. 用户登陆时,会发送用户名密码过来
  2. 服务器拿到用户信息,生成一个sessionid,存到数据库,并给客户端返回该id。
  3. 客户端后续请求都带上该sessionid,发送到服务器。
  4. 服务器验证该id,如果在数据库存在,则证明该请求是合法的。

token

  1. 用户登陆时,会发送用户名密码过来
  2. 服务器拿到用户信息,服务器通过一定的加密算法,生成一个token,并返回给客户端。
  3. 客户端后续请求都带上该token,发送到服务器。
  4. 服务器用相同加密算法解密,如果解密成功,则证明该请求是合法的。

session和token区别就是,token少了在服务器存储的过程,这在大体量数据时,优势很明显,因为token相比session少了一次查询,会提高效率。

cookie

上面的token和session,都是服务器生成,然后返回客户端,客户端会将session或token存在本地,每次请求都会携带发送,这个客户端本地存储技术,就是cookie。

roxy0724 commented 5 years ago

Cookie

当web服务器向浏览器发送web页面时,在关闭连接后,服务端并不会记录用户的信息,cookie的作用就是用于解决如何记录用户端的客户信息。cookie以键值对形式存储。

Session

session是另一种记录客户状态的机制,不同于cookie保存在浏览器上,session保存在服务器上。每个用户访问服务器都会建立一个session,并分配一个sessionId。客户再次访问的时候直接查询session状态。

Token

token是服务器生成的一串字符串,以作为客户端进行请求的一个令牌。当用户第一次登陆后,服务器生成一个token并将其返回客户端,之后客户端只需带上token请求数据即可,无需再次验证用户信息。使用token的目的是减少服务器压力,减少频繁查询数据库。