理解Session,Token,Cookie,sessionStorage,localStorage

理解Session,Token,Cookie,sessionStorage,localStorage

  • 无验证Web Server
  • 单进程Web Server 的 Session验证模式
  • 集群Web Server 的 Session验证模式
  • Token验证模式
  • Cookie的作用
  • Web Storage作为Cookie的替代品
  • sessionStorage应用场景
  • localStorage应用场景
  • Token & Cookie使用方式
  • Token & WebStorage使用方式

Session 和 Token 可以算是服务端验证功能,Cookie,sessionStorage,localStorage则是浏览器存储功能

无验证Web Server

最早的Http是没有用户管理这个模块的,所有人上网只是为了查询资料,服务器不用保存用户信息,这个阶段也就不需要用到任何验证手段。访问静态资源,传输返回即可。

单进程Web Server 的 Session验证模式

但是随着交互式Web应用的兴起,需要使用到用户系统,用户的数据是保存在数据库中的,如果用户每一次请求都携带用户名和密码,势必会给服务器带来巨大的性能瓶颈。此时,session模式开始兴起,具体模式是生成一个随机字符串,在服务器内存记录随机字符串(Session id)和用户信息(Session Object)的映射,每次用户请求都发送session id给服务器,服务器就可以知道这一次请求对应的那些用户数据,从而就不用一直取查询数据库了。

集群Web Server 的 Session验证模式

随着用户越来越多,单进程已经无法承载所有的用户了,于是出现了负载均衡的Web Server,此时的Web Server就面临着多进程共享Session id的情况了。一种解决方案是,即使同步两个进程的Session table, 随着进程数量的增加,这肯定是不可行的。 第二种解决办法是使用Session Sticky,即一部分Session只能访问特定的Web Server,但是这又给高可用带来了问题,当一台机器挂掉的时候,就需要让这些用户重新在另一个Web Server上重新登录。第三种解决办法是使用memcache,所有的Web Server都访问一个缓存中心,所有的session都存在缓冲中心上,这样就无视Web Server的高可用问题了。但是这也同时带来了memcache的高可用问题,如果memcache挂掉了,所有人都必须要重新登录。

Token验证模式

Session的核心在于验证,当然验证可以使用别的方法,比如加密。通过加密解密来代替Session id的服务器校验的方式就是Token验证。使用HMAC-SHA256算法对用户的id和过期时间进行加密,加密和解密方都是服务器,其他人在无法获取加密key的情况下几乎是无法破解的。也就是牺牲了一点点CPU性能就节约了大量的Session内存, 同时也无需等待异步请求memcache获取Session id结果,即节约了时间。
目前Token验证可以使用JSON web token(jwt)技术。

Cookie的作用

Cookie完全不同于Session和Token,Cookie只是一种存储方法,数据由服务器生成,Cookie存的数据会在下次访问这个网站的时候传过来。为了不让Cookie占用过多的存储空间,浏览器对Cookie的使用大小由限制。
从Cookie的功能角度上看,完全匹配上了Session和Token的使用场景,所以可以把Session或者Token信息从服务端生成后,直接设置到Cookie中,但是用户并不知道,从而在使用角度上产生了一种类似于TCP长连接的错觉。

Web Storage作为Cookie的替代品

Cookie机制也有很多缺陷:大小受限,户可以操作(禁用)cookie,使功能受限,安全性较低,有些状态不可能保存在客户端,每次访问都要传送cookie给服务器,浪费带宽,cookie数据有路径(path)的概念,可以限制cookie只属于某个路径下。
WebStorage 是HTML5标准增加浏览器存储机制,用于替代Cookie。使用本地数据库来存储信息,原本必须保存在服务器端数据库中的内容现在可以直接保存在客户端本地了,这大大减轻了服务器端的负担,同时也加快了访问数据的速度。

sessionStorage应用场景

sessionStorage适用于临时保存的场景。session是指用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。session对象可以用来保存在这段时间内所要求保存的任何数据。

localStorage应用场景

localStorage适用于永久保存的场景。将数据保存在客户端本地的硬件设备(通常指硬盘,也可以是其他硬件设备)中,即使浏览器被关闭了,该数据仍然存在,下次打开浏览器访问网站时仍然可以继续使用。

Token & Cookie使用方式

当Token需要存储在Cookie中时,在response中添加cookie

HTTP/1.1 200 OK
Set-Cookie: access_token=eyJhbGciOiJIUzI1NiIsI.eyJpc3MiOiJodHRwczotcGxlL.mFrs3Zo8eaSNcxiNfvRh9dqKP4F1cB; Secure; HttpOnly;

随后的请求需要带上Token

GET /stars/pollux
Host: galaxies.com
Cookie: access_token=eyJhbGciOiJIUzI1NiIsI.eyJpc3MiOiJodHRwczotcGxlL.mFrs3Zo8eaSNcxiNfvRh9dqKP4F1cB;

Token & WebStorage使用方式

使用Bearer Token验证方式
首先拿到JWT Token

HTTP/1.1
POST /token
Host: galaxies.com
Content-Type: application/x-www-form-urlencoded
username=abc&password=password

服务器返回

HTTP/1.1 200 OK
{
     
  "access_token": "eyJhbGciOiJIUzI1NiIsI.eyJpc3MiOiJodHRwczotcGxlL.mFrs3Zo8eaSNcxiNfvRh9dqKP4F1cB",
       "expires_in":3600
 }

下次请求时,需要带上这个token,以便服务器验证。

将Token存储于LocalStorage或SessionStorage

function tokenSuccess(err, response) {
     
    if(err){
     
        throw err;
    }
    $window.sessionStorage.accessToken = response.body.access_token;
}

接下来的请求需要带上Token:

HTTP/1.1
GET /stars/pollux
Host: galaxies.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsI.eyJpc3MiOiJodHRwczotcGxlL.mFrs3Zo8eaSNcxiNfvRh9dqKP4F1cB

你可能感兴趣的:(Web,Server,Session,Token,Cookie,sessionStorage,localStorage)