zoukankan      html  css  js  c++  java
  • Token&Cookies&Session


    title: Token&Cookies&Session
    date: 2018-04-19 19:52:01
    tags: [vue,token,cookies,session,login]
    categories: 前端技术

    最近遇到前后端验证登陆的问题,学习并记录如何验证。现在许多的大型网站已经采用Token的方式进行验证,简化了验证流程。百度百科称token是一种令牌机制,实际上就是一串加密的字符串,通过解密来验证是否登陆。

    传统验证登陆的方法

    HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。

    解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。

    上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。

    基于Token的验证方法

    采用Token的验证方式,需要将Token字符串在本地记录,一般使用LocalStorage或者SessionStorage在本地储存起来。具体流程如下:

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

    JWT

    实现token的方式可以有很多,JWT是其中的一种方式,其实本质上只是一个字符串,无论什么字符串都可以,但需要保证加密的可靠性,以及相关的标准,这样比较符合开发逻辑。这种验证方式的Token包含三个部分,具体如下:

    1. header
    2. payload
    3. signature

    三部分使用“,”隔开,并且使用base64编码。实例如下:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

    header 部分主要是两部分内容,一个是 Token 的类型,另一个是使用的算法,比如下面类型就是 JWT,使用的算法是 HS256。
    { "typ": "JWT", "alg": "HS256" }
    上述字符通过Base64编码后得到eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

    Payload

    Payload 里面是 Token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。下面是标准字段:

    • iss:Issuer,发行者
    • sub:Subject,主题
    • aud:Audience,观众
    • exp:Expiration time,过期时间
    • nbf:Not before
    • iat:Issued at,发行时间
    • jti:JWT ID

    例如:

    { "iss": "ninghao.net", "exp": "1438955445", "name": "wanghao", "admin": true }

    Signature

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

    • header

    • payload

    • secret

      var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
      HMACSHA256(encodedString, 'secret');

    处理完成以后看起来像这样:

    SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

    最后这个在服务端生成并且要发送给客户端的 Token 看起来像这样:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

    客户端收到这个 Token 以后把它存储下来,下回向服务端发送请求的时候就带着这个 Token 。服务端收到这个 Token ,然后进行验证,通过以后就会返回给客户端想要的资源。

    Token使用中需要注意的几点#

    1. Token 应该被保存起来,放到 local / session stograge 或者 cookies
    2. Tokens 除了像 cookie 一样有有效期,而且可以有更多的操作方法
    3. 有需要的话,要加密并且签名 token
    4. Tokens 不是万能的解决方法,得根据你的需求自行采用
    5. 将 JSON Web Tokens 应用到 OAuth 2

    相关链接:

  • 相关阅读:
    使用node调用支付宝生成支付二维码(沙箱环境)
    nodejs+mysql嵌套查询的问题
    移动端H5开发问题记录
    在jquery中,使用ajax上传文件和文本
    css百分比值到底参考谁?
    vue cli3 + cube-ui 配置rem踩坑记录
    MFC【exe】工程中的文件大致信息(翻译的)
    ActiveX、OLE和COM/DCOM
    系统版本
    图形库
  • 原文地址:https://www.cnblogs.com/didadida/p/10144472.html
Copyright © 2011-2022 走看看