博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
219. 单页应用 会话管理(session、cookie、jwt)
阅读量:6442 次
发布时间:2019-06-23

本文共 1980 字,大约阅读时间需要 6 分钟。

原文链接:

关键字:http-only, cookie,sessionid, vue-router, react-router, 安全localStorage, jwt

需求描述

  1. 内部管理平台,需要用户登录之后才能访问。现在将 该平台地址( 直接发给新来的运营同学
  2. 前端需要检测该用户是否已登录,如果未登录,则将其 redirect 到登录页面
  3. 因为该页面为单页应用,路由跳转不涉及后端的 302 跳转,使用前端路由跳转

实现思路

实现代码

// 以 vue-router 为例// 登录中间验证,页面需要登录而没有登录的情况直接跳转登录router.beforeEach((to, from, next) => {  const hasToken = document.cookie.includes('sessionid');  // 如果采用 jwt,则同样 hasToken = localStorage.jwt  const pathNeedAuth = to.matched.some(record => record.meta.requiresAuth);  // 用户本地没有后端返回的 cookie 数据 && 前往的页面需要权限  //   if (pathNeedAuth && !hasToken ) {    next({      path: '/login',      query: { redirect: to.fullPath },    });  } else if (hasToken && to.name === 'login') {    // 已登录 && 前往登录页面, 则不被允许,会重定向到首页    next({      path: '/',    });  } else {    next();  }});复制代码
  1. 应该在进入任何页面之前,判断:
    1. 该页面是否需要权限才能访问:登录、注册页面不需要权限
    2. 用户是否已经登录:本地 cookie (或者 localStorage)包含 session 相关信息
    Cookie: csrftoken=YaHb...; sessionid=v40ld3x....复制代码
  2. 如果 A页面需要权限本地 cookie中包含了 sessionid 字段,则允许访问A页面,否则跳转到登录页面
    1. 备注:sessionid 该字段由用户在登录之后,由后端框架通过 response.setCookie 写入前端 ,因此该字段需要和后端同学确认
    2. 需要后端同学在 response header 中配置cookie中该字段的 http-only属性,允许前端读取 cookie。否则前端通过 document.cookie 读取到的 cookie 将不包含 sessionid 字段
    3. 这个时候,可能会存在 js 读取cookie 导致不安全的情况,后端同学可以把 cookie 中的某个字段设置为 允许读取,其他 cookie 设置不允许读取,这样即使被第三方不安全脚本获取,也无法产生负面影响。
  3. 如果用户已登录 && 在浏览器中输入了登录页地址,则将其重定向到首页

更多说明

  1. 这样做,前端就不必再向后端发起 API 做权限鉴定了(后端返回401,前端跳转到 401),减少不必要的API 请求,特别是如果在API响应时间过长的情况下,体验不太友好。

  2. 用户修改 cookie,伪造 sessionid

    1. 这样的话,前端就无能为力了,前端鉴权此时认为该用户合法。此时访问首页,将会调用获取数据的API。
    2. 浏览器会将 用户伪造的 sessionid 带给后端,这时候就需要后端对 sessionid 进行较验了。比如校验前端带来的 sessionid 与数据库中的 sessionid 是否一致
    3. 用户伪造的数据 sessionid 和 后端数据库中 sessionid 的概率 非常非常低,可以忽略不计,因为 sessionid 的位数一般在 32 位以上,因为里面包含了字母和数字,也就由 32 ^ 36 种可能
    4. 结论:伪造没有意义,即使用户可以看到页面的样子,但是看不到数据
  3. 采用 localStorage 而不是 sessionStorage 的原因(SessionStorage 失效场景)

    原因:sessionStorage 无法跨 Tab 共享

    1. 用户在新打开一个 Tab,输入已经登录之后的某个页面
    2. 通过target="_blank" 来打开新页面的时候,会导致会话失效
    3. 在当前页面执行 Duplicate (复制 Tab),sessionStorage 失效

转载于:https://juejin.im/post/5c07d04851882508851b8534

你可能感兴趣的文章
高效的CSS代码(2)
查看>>
朱兰的质量三部曲——《可以量化的管理学》
查看>>
丰田生产方式和TOC工序切换时间的解决
查看>>
2017年勒索软件、物联网攻击将继续肆虐
查看>>
用友网络董事长王文京为何出现在乌镇大会中?
查看>>
大学团队打造手语翻译机器人,完整安装下来需要149个小时
查看>>
Wireshark抓包分析/TCP/Http/Https及代理IP的识别
查看>>
不同包下,相同数据结构的两个类进行转换
查看>>
软件安装(linux)
查看>>
TeamPlain for VSTS - Web Access for Team System-TFS 跨平台的客户端
查看>>
面对前车之鉴的AR,现在的VR要做些什么?
查看>>
vscode 换行符\n 变成\r\n
查看>>
一个绘制虚线的非常规函数(常规方法,打印机上绘制不出虚线)
查看>>
获得本机的IP,掩码和网关
查看>>
大数据之 ZooKeeper原理及其在Hadoop和HBase中的应用
查看>>
Delphi中将XML文件数据装入DataSet
查看>>
你刚才在淘宝上买了一件东西
查看>>
发布一个 Linux 下的 C++ 多线程库
查看>>
Python序列类型
查看>>
再谈ThinkPHP
查看>>