很多答案都提到了 JWT、Session、Cookie,但是我发现常常有人混淆这三个概念。或者说不同的语境下大家对 Session 会有不同的理解。

首先这三个名词表示的是三个纬度的东西,不能简单地说这个方案可以替代那个方案,更不能直接拿来做比较

Session 表示客户端和服务端之间的会话,因为 HTTP 请求是无状态的,所以为了把一个 HTTP 请求跟其他 HTTP 请求关联起来让服务端知道当前在跟它对话的客户端是谁,我们就需要有一种机制来保存这些请求之间的用户数据,这就是会话。所以题主所问的“如何记录用户登录状态”其实就是“如何保持一个会话“。

Session 机制的实现一般有两种,最常见的就是服务端给客户端发一个 id,然后在服务端存上这个 id 所对应的数据,如果用户有登录,就把用户的 id 存到对应的数据里。另外一种就是把会话的数据加密签名后发给客户端,这样服务端就不需要再去存数据,典型的例子就是 Rails 的默认 Session 实现。这里的 id 和加密数据的传输和存储一般情况下会用 Cookie 来实现。

另外,有人说 “session” 这个词的时候,也可能指他所用的 web 框架对 Session 机制的实现,或者指跟 Session 所关联的数据。但是在这里,我们所说的 Session 都是指 Session 机制。

Cookie 是什么就不说了。

JWT 是一种 token 的生成标准,具体这个标准是什么样,用 JWT 的好处,这里不展开,可以看官网文档。通常情况下,我们用 JWT 就是为了实现上面讲的第二种 Session 机制,把会话数据(通常就是 user id)存在客户端。

搞清楚了这三者的概念,我们再来看下怎么样才是使用 JWT 的正确姿势。

有人推荐把 JWT 存在 Local Storage/Session Storage 里,其实这是有风险的,当你的应用有 XSS 漏洞时,攻击者很容易就能拿到用户的 token,然后为所欲为。所以,不推荐把 JWT 存在 Local Storage 等任何可以被 JS 直接读取到的地方。

推荐把 JWT 放在 Cookie 里,并且设置 httpOnly 属性。不过,放在 Cookie 里会面临另外一个 CSRF 攻击的风险,你可以通过设置一个 csrf token 来防止此类攻击,现代 web 框架都会自带这个功能,比如:Securing Rails Applications​guides.rubyonrails.org

安全 - 为企业级框架和应用而生​eggjs.org

要注意的是, Cookie 的值会有 4KB 大小的限制,所以不要在 JWT 里塞太多东西。

最后总结成一句话回答题主的问题:我们可以通过把 JWT 保存在 Cookie 里来保持 Session。

所以你看,如何保持 Session 其实跟你的应用有没有用前端框架,是不是 SPA,关系不大。

注:以上方案只针对 web 应用。

api可以主动采集用户数据吗_现在的前端框架全是通过API获得数据,如何记录用户登录状态?...相关推荐

  1. api可以主动采集用户数据吗_数据采集方式有哪些,都有什么特点?

    一.为什么要做数据采集? 为什么要做数据采集呢?其实道理很简单,就是巧妇难为无米之炊. 通俗来讲就是有什么样的食材,我们才能炒出什么样的菜.比如说如果我们只有土豆茄子的话,那么无论如何也是做不出红烧肉 ...

  2. api可以主动采集用户数据吗_数据埋点采集的那些事儿

    数据采集是数据分析的基础,而埋点是最主要的采集方式.那么数据埋点采集到底都是哪些事呢?我们主要从三个方面来看:什么是埋点,埋点怎么设计,埋点的应用. 一.数据采集以及常见数据问题 1.1数据采集 数据 ...

  3. web数据交互_通过体育运动使用定制的交互式Web应用程序数据科学探索任何数据...

    web数据交互 Most good data projects start with the analyst doing something to get a feel for the data th ...

  4. 政府公开数据可视化_公开演讲如何帮助您设计更好的数据可视化

    政府公开数据可视化 What do good speeches and good data visualisation have in common? More than you may think. ...

  5. centos mysql导出数据库命令_在centos(linux)下用命令导出mysql数据库数据

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  6. hbase集群 数据写入_一种构建HBase集群全文索引方法,数据读取方法以及数据写入方法与流程...

    本发明涉及HBase集群领域,尤其涉及一种构建HBase集群全文索引方法,数据读取方法以及数据写入方法. 背景技术: 随着云计算技术的不断发展,云计算技术不断落地成为支撑各行业信息技术发展的重要支柱. ...

  7. 微信小程序数据拼接_最佳方式实现微信小程序分页加载数据

    一般小程序做分页加载数据,会做一些下拉加载更多.然后上拉刷新的操作.数据放在一个for循环里去加载,数据源是一个数组对象.在加载下一页数据时,将下一页的数据拼到当前数组后面.这样的确可以实现分页加载数 ...

  8. python怎么利用数据成像_第一张黑洞照片全靠VLBI,这个Github项目教你用Python实现...

    [新智元导读]哈佛学生写的Python模块,用于模拟和操作VLBI数据并使用正则化最大似然法生成图像,模拟黑洞成像的算法.进入Github飙升榜TOP 3,超过1000星. 为了拍到本次的黑洞照片,科 ...

  9. api可以主动采集用户数据吗_自动采集数据

    自动采集数据,三个方式: agent 方式: agent:就是一个客户端,在客户端上放置采集程序,agent采集完数据后就直接返回给api程序(目前就是django的一个程序) agent程序: #! ...

最新文章

  1. Levenshtein 相似度算法——Levenshtein(编辑距离)
  2. querySelector querySelectorAll
  3. 为线程设置一个名字 [mythread setName:@第一个子线程];
  4. Yii自定义验证规则
  5. 【SQLite】简单的基本使用步骤
  6. android sqlite批量操作,Android: SQLite批量插入数据的最佳实践
  7. 发送邮件 的类 C# .net
  8. Java之JSON详解
  9. Visio连接线的箭头如何变为直线、双箭头;直线转换为箭头
  10. Ubuntu 更改默认浏览器
  11. 语法长难句之从句——名词性从句
  12. MongoDB:查询文档
  13. 用VB.NET(Visual Basic 2010)封装EXCEL VBA为DLL_COM组件(一)
  14. P、*P和P三者的区别
  15. java session logout_Spring Session Logout
  16. 【信号系统实验2】MATLAB—连续时间信号与系统的频域分析
  17. Java实现调用默认浏览器打开网址
  18. 【二分查找】详细图解
  19. Joplin常用插件说明与下载
  20. linux下bin安装包制作教程

热门文章

  1. android处理服务器的集合,android集合SSH搭建服务器客户端请求
  2. mysql dump gtid_mysqldump导出数据备份 --set-gtid-purged=OFF
  3. alpinestars与丹尼斯_胖摩的骑行路 篇四:真的值到了—丹尼斯MOTORSHOE AIR骑行靴...
  4. 电脑桌面没有计算机图标鼠标也点不起来,为什么我的电脑桌面上的图标有时用鼠标怎么点也没反应呀?...
  5. 链表有环是什么意思_互联网大厂offer收割之单向链表的概念及面试题大全
  6. 【windows7】解决IIS 80端口占用问题(亲测)
  7. Datatable Initialization - 使用objects数据源初始化
  8. centos6.5 scala环境变量
  9. HAL驱动库学习-ADC
  10. [HDOJ1016]Prime Ring Problem