RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 566752
Accepted
sanu
sanu
Asked:2020-09-16 06:12:58 +0000 UTC2020-09-16 06:12:58 +0000 UTC 2020-09-16 06:12:58 +0000 UTC

开发JSON API时如何正确存储session?

  • 772

我们通常将session id 存储在浏览器的cockie 中。但是假设我想在 ios/android 移动应用程序中使用我的 API,我将在应用程序的内存中存储一​​个 cookie,然后将其插入到应用程序的每个请求中。但这有多正确呢?有什么提示吗?

json
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    etki
    2020-09-16T08:40:27Z2020-09-16T08:40:27Z

    但这有多正确呢?

    根本没有其他方法。您需要以某种方式识别 API 的用户。通过任何间接迹象,您无法识别它 - 多个消费者可以坐在一个 IP 上,原则上没有用户代理,通常它只是一个欺骗性标头,仅此而已。

    因此,您需要在每个请求中传递一些标识符,以帮助您找到用户。这里有一些微妙的地方:

    • 不应该是用户ID本身(否则整个机制就突破了ID的劫持,被劫持的用户除了杀了他什么也做不了)
    • 此标识符(或与之关联的机制)必须明确确认会话的正确性或仅通过安全通道 (HTTPS) 传输,否则它可能会以完全相同的方式被盗并显示为错误的用户。
    • 标识符应被视为应用程序中的消耗品:它们可以始终是 bang,并且可以创建新的标识符,以便在检测到盗窃后可以立即重置任何被盗的标识符

    常见的方法是在任意标头(github、google、amazon s3)中传递访问令牌。无论哪种方式,身份验证信息始终保留在标头中(它在查询参数中没有位置,而是直接在请求正文中),因此这里也没有太多选择。令牌存储在设备上,以防万一,用户删除令牌(使用相同的访问令牌)

    最后一段是关于确认会话的正确性,通过不安全的通道传输。
    如果担心令牌在传输过程中被拦截,则有必要以某种方式对传出请求进行签名。为此,您可以使用完整或轻量级的挑战-响应身份验证,其含义可以简化为服务器和客户端互相询问只有他们自己才能解决的谜语。在最简单的版本中,服务器可以发布一个由标识符和秘密部分(加密密钥)组成的令牌,在创建令牌时将其传输一次给客户端(客户端也可以发送一些秘密,但我们认为服务器始终可以信任)。之后,从客户端到服务器的所有消息要么使用接收到的密钥完全加密,要么在附加标头中包含基于密钥和请求主体生成的签名,攻击者无法伪造该签名,在不窃取密钥的情况下。然而,这本身并不能防止:

    • 重播攻击(例如,如果用户发送请求“删除最后一个条目”,那么攻击者可以生成另外一百个这样的请求并完全清除用户的历史记录)。最简单的解决方案是兼顾时间戳(例如,不接受超过 5 秒的请求),但会在最轻微的时间问题上开枪。
    • 从客户端物理撤回密钥。一般认为这是防不胜防的,这一点索性就忽略了。
    • 在颁发令牌时拦截密钥(因此,毕竟还是获得 HTTPS 比较好)。对于开放流量,您可以使用 Diffie-Hellman 算法和类似物,但这比编写应用程序本身要花费更多时间。
    • 使用不正确算法时的密钥计算(例如,如果没有密钥轮换并且如果攻击者知道始终使用 JSON,那么他知道最后一个字符始终是}or ],可以通过比较不同长度的请求来计算密钥)。同样,采用 HTTPS 更容易,还有其他方法,但我不会告诉他们,以免无意中错过重要的一点。

    更新。有一个标准的json web token,我自己还没有读过。

    • 2
  2. Firepro
    2020-09-16T06:34:26Z2020-09-16T06:34:26Z

    这是 API 开发的正确方法之一。在开发 REST API 时有这样一种情况,即无状态(STATEless)。

    客户端的状态不以任何形式存储在服务器上,这完全由客户端自己完成

    服务器与客户端接口及其状态无关。在服务器端,用户上下文不会在两个不同的请求之间保存。

    每个请求都包含处理程序所需的所有信息,会话状态存储在客户端。

    无状态提高了 Web 服务性能并简化了服务器端组件的设计和实现,因为服务器上的无状态消除了与外部应用程序同步会话数据的需要。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5