token,session,cookie

通俗的来说就是暗号(一串字符串或者别的),这个暗号可以用来做很多事,最常做的是身份验证。

基于session的网站身份验证流程:(传统验证流程)

  因为http协议是无状态的,用户在利用账号密码登陆验证后,后面的请求,服务器无法验证用户的身份,所以,在登陆后,服务器会给客户端发session(会过期),存在cookie里,客户端登陆后的请求都带有这个session,服务器校验session,如果通过,就返回相应信息。

 

基于token的身份验证流程:

  token也一样。

  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求,去验证用户名与密码
  3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
  6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

一个通用的标准web token:JSON Web Tokens

长这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

构成:

  header.PayLoad.Signature

header:

  一个是 Token 的类型,另一个是使用的token加密算法

  {
    "typ": "JWT",
    "alg": "HS256"
  }


Payload:
  • iss:Issuer,发行者
  • sub:Subject,主题
  • aud:Audience,观众
  • exp:Expiration time,过期时间
  • nbf:Not before
  • iat:Issued at,发行时间
  • jti:JWT ID
Header和Payload都要编码成一个字符串

Signature:
  JWT 的最后一部分是 Signature ,这部分内容有三个部分,先是用 Base64 编码的 header.payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。

  var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload); 
  signature = HMACSHA256(encodedString, 'secret)
 
Cookie:
  http无状态下,浏览器客户端为了维持客户端和服务器会话状态的字段(字符串),Cookie的内容也是明文保存的,有些浏览器提供界面修改,所以, 不适合保存重要的或者涉及隐私的内容。

  是客户端生成的,理论上用来存储一些额外页面信息。

     会存在客户端请求包的header里

session: 

http无状态下,服务器为了维持客户端和服务器会话状态的字段(字符串),一般用cookie来传递
因为会占用服务器的内存,所以最好用来存一下重要的信息,如登陆信息。

 

posted @ 2017-04-23 17:10  shinymood  阅读(254)  评论(0编辑  收藏  举报