在RESTful API中使用会话是否真的违反了R??ESTfulness?我看到很多意见朝着两个方向发展,但我不相信会话是无REST的。在我看来,我的观点是:
-
RESTfulness不禁止身份验证(否则在RESTful服务中几乎没有用)
-
通过在请求中发送身份验证令牌(通常是标头)来完成身份验证
-
此身份验证令牌需要以某种方式获取并可能被撤销,在这种情况下需要续订
-
验证令牌需要由服务器验证(否则它不会是身份验证)
会话如何违反这一点?
-
客户端,会话使用cookie实现
-
cookies只是一个额外的HTTP标头
-
可以随时获取和撤销会话cookie
-
如果需要,会话cookie可以有无限的生命周期
-
会话ID(身份验证令牌)在服务器端验证
因此,对于客户端,会话cookie与任何其他基于HTTP头的身份验证机制完全相同,只是它使用Cookie头而不是Authorization或其他专有头。如果cookie值服务器端没有附加会话,为什么会产生影响呢?只要服务器表现为RESTful,服务器端实现就不需要关注客户端。因此,cookie本身不应该使API无REST,而会话只是客户端的cookie。
我的假设是错的吗?什么使会话cookie RESTless?
-
我在这里介绍了这个问题:stackoverflow.com/questions/1296421/rest-complex-applications/
-
要添加,如果您只使用会话进行身份验证,那么为什么不使用提供的标头?如果没有,并且您正在将会话用于其他对话状态,那么这违反了REST的无状态约束。
-
@Will谢谢。您似乎在谈论暂时存储用户提交的数据的会话,而在我的情况下,我只是将它们作为身份验证的实现细节。这可能是分歧的来源吗?
-
@Will Hartung:从协议的角度来看没有显着差异。过滤器也应该保留在服务器端,并且应始终传递过滤器ID。 100%与会话相同。
-
@deceze我唯一的观点是,如果您要使用标头来表示身份验证令牌,HTTP会提供超出通用cookie的一个。所以,为什么不使用它并保留你用它获得的自由语义(任何看到有效负载的人都可以看到分配给它的身份验证令牌)。
-
@zerkms这不仅仅是关于协议,它也是关于语义的。
-
@Will那么整个辩论只是一个语法问题? :)如果Authorization标题的行为与会话cookie完全相同,那么它是完全RESTful的吗?我同意饼干有点"脏",但没有技术差异。
-
@Will Hartung:仍然没有看到任何区别。你给了同一种技术不同的名字。我们可以将其命名为filter,但它仍然是一个会话。
-
当然,但为什么不组成自己的标头,或者劫持auth令牌的其他标头。使用X-XYZZY标题。这只是语法吗?标题传达信息。 Authorization标头比您的cookie更"自我记录",因为"每个人"都知道Auth标头的用途。如果他们只是看到JSESSIONID(或其他),他们就不能做出任何假设,或者更糟糕的是,做出错误的假设(他在会话中存储了什么,还有什么用于此等)。您是否在代码Aq12hsg中命名变量?不,当然不。这同样适用于此。
-
@zerkms不,这是一个过滤器。过滤器具有与会话不同的语义。不同的生命周期,不同的工作流程,不同的目
-
@Will Hartung:当时无法理解:-S从你的帖子我发现它们非常相似。
-
这种基于意见的问题违反了规则。许多好的问题根据专家经验产生一定程度的意见,但这个问题的答案几乎完全基于意见,而不是事实,参考或具体的专业知识。如果可以重新编写此问题以符合帮助中心的规则,请编辑问题。
首先,REST不是宗教,不应该这样接近。虽然RESTful服务有一些优点,但只要对应用程序有意义,就应该遵循REST的原则。
也就是说,身份验证和客户端状态不违反REST原则。虽然REST要求状态转换是无状态的,但这指的是服务器本身。从本质上讲,REST的所有内容都与文档有关。无国籍状态背后的想法是SERVER是无状态的,而不是客户端。发出相同请求的任何客户端(相同的标头,cookie,URI等)应该被带到应用程序中的相同位置。如果网站通过更新此服务器端导航变量来存储用户的当前位置和托管导航,则将违反REST。具有相同请求信息的另一个客户端将根据服务器端状态被带到不同的位置。
Google的Web服务是RESTful系统的绝佳示例。它们需要一个带有用户身份验证密钥的身份验证标头,以便在每次请求时传递。这确实略微违反了REST原则,因为服务器正在跟踪身份验证密钥的状态。必须维护此密钥的状态,并且它具有某种到期日期/时间,之后它不再授予访问权限。但是,正如我在帖子顶部提到的那样,必须做出牺牲以允许应用程序实际工作。也就是说,身份验证令牌必须以允许所有可能的客户端在其有效时间内继续授予访问权限的方式存储。如果一台服务器正在管理身份验证密钥的状态,以至于另一台负载均衡的服务器无法接管基于该密钥的请求,那么您已经开始真正违反REST的原则。 Google的服务可以确保您可以随时将您在手机上使用的身份验证令牌与服务器A进行负载均衡,并从桌面访问负载均衡服务器B,并且仍然可以访问系统并转到相同的资源,如果请求是相同的。
这一切归结为您需要确保您的身份验证令牌针对某种类型的后备存储(数据库,缓存等)进行验证,以确保您保留尽可能多的REST属性。
我希望所有这一切都有道理。您还应该查看维基百科关于具象状态转移的文章中的约束条款(如果您还没有)。关于REST的原则实际上在争论什么以及为什么,这一点尤其具有启发性。
-
这正是我看待REST的方式。据我所知,创建一种在某种程度上没有状态的身份验证机制几乎是不可能的,所以如果一般身份验证都是RESTless的话。
-
我会改写你的初步陈述。如果REST的约束能够理解您的应用程序,则只使用REST。您可以自由应用这些约束的子集,您将获得一部分好处。但是,此时您已经创建了自己的建筑风格。这不是一件坏事,事实上这就是罗伊论文前四章的原则设计。 REST只是一个例子。
-
@Jared您确定Google身份验证令牌没有编入其中的失效日期吗?看起来好像不会很难做到。
-
@Darrel一个公平的观点。老实说,我不确定Google是如何做到这一点的,但过期时间可以编码到身份验证令牌中。我相信我的更大观点仍然有效。有一些类型的状态只需要维护,只要你理解为什么REST要求无状态,你可以以一种有意义的方式违反它,对系统的其余部分和RESTful架构的优势产生许多影响。 。
-
由于到目前为止还没有其他论点,我接受这个写得很好的回复。我认为重要的部分是无状态服务器并不意味着无状态服务器,我认为这些服务器经常被误解或误用。服务器可以(并且通常必须)具有它想要的任何状态,只要它的行为是幂等的。
-
我听过很多讲道,会议不安宁。如果您尝试构建Web应用程序,HTTP基本身份验证是一个真正的倒退。
-
可以创建一个完美的RESTful身份验证系统。如果Google对身份验证信息进行编码,即到期日期加上由所有Google服务器都知道的私钥编码的令牌,那么它可能完全是RESTful。我不是为了宗教战争,但如果人们打算将他们的API称为RESTful,那么他们应该知道这意味着什么。有太多的傻瓜投掷最新的流行语,不知道它们是什么意思。
-
@jcoffland,如果服务器无法验证身份验证状态,则可以伪造。例如,我可以对我的令牌进行逆向工程以改变我的到期时间。或者我可以通过获取他们的身份验证令牌假装成其他人。它归结为对开发人员或组织更重要的事情:坚持应用程序架构风格或保护身份。
-
@Micah Henning,您假设服务器需要状态信息来验证身份验证令牌。如果您不知道私钥,我们可以合理地假设您不能伪造由公钥/私钥对签名的令牌。要验证令牌是否有效,您只需要公钥。我仍然认为完全可以进行RESTful身份验证。
-
@jcoffland是的,我完全同意。你的评论让我思考......所以我基于Kerberos的设计松散地创建了一个无状态和无会话的身份验证和授权库。它工作得很好,看起来非常安全。但是,由于GET请求不能可靠地携带正文数据,因此应通过GET访问的每个受保护资源都必须通过POST或PUT进行访问。我还没有办法解决这个问题。
-
@MicahHenning,如果你没有发送正文数据的可能性,为什么不使用HTTP头WWW-Authenticate呢?以亚马逊为灵感资源:docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html,他们将AWS定义为Digest和Basic。浏览器可能不知道如何处理AWS身份验证,因此如果您不希望浏览器显示它,他将不会显示登录窗口,因此决定不使用此标头。
-
@SimonSimCity谢谢你!我会尽快详细介绍一下。
-
@jcoffland - 我认为你说使用包含过期和签名的令牌,你可以拥有一个真正无状态的RESTful身份验证解决方案。但实际上,没有办法使这个令牌无效。如果令牌是长期存在的,那么如果令牌被盗则会出现安全问题。如果令牌是短暂的,你必须定期生成新的令牌(这涉及让用户输入他们的用户名和密码 - 最后,不管用户的密码状态是什么?)(不要试图成为有争议的,只是想试试这个问题)
-
@James,如果一个长期存在的令牌被盗,这意味着用户的机器已被盗用,在这种情况下,所有赌注都将被取消。但是,短期令牌是一种选择。您可以允许用户在旧令牌仍处于活动状态时使用旧令牌续订令牌。这避免了必须重新认证的问题,但是很棘手,而且对手也可以这样做。用户的密码是state。请注意,用户可以显示旧令牌和加密密码。只有服务器可以解密旧令牌并检查密码。
-
@James,如果一个长期存在的令牌被盗,这意味着用户的机器已被盗用,在这种情况下,所有赌注都将被取消。但是,短期代币是一种选择。用户可以呈现旧令牌加密码,加密。只有服务器可以解密旧令牌并检查密码。然后它会发出一个新令牌。或者,用户可以呈现未到期的令牌并要求刷新它。当然,对手也可以做到这一点。我同意密码是州,但国家可以保持客户端。
-
首先,REST不是宗教,不应该这样接近。虽然RESTful服务有一些优点,但只要对应用程序有意义,就应该遵循REST的原则。 - 但是,我可能会因为这样说而成为你的宗教信仰。谢谢。使用适用于您的目的......什么是概念。
首先,让我们定义一些术语:
-
REST风格:
One can characterise applications conforming to the REST constraints
described in this section as"RESTful".[15] If a service violates any
of the required constraints, it cannot be considered RESTful.
根据维基百科。
-
无国籍约束:
We next add a constraint to the client-server interaction:
communication must be stateless in nature, as in the
client-stateless-server (CSS) style of Section 3.4.3 (Figure 5-3),
such that each request from client to server must contain all of the
information necessary to understand the request, and cannot take
advantage of any stored context on the server. Session state is
therefore kept entirely on the client.
根据菲尔丁的论文。
因此,服务器端会话违反了REST的无状态约束,因此RESTfulness也是如此。
As such, to the client, a session cookie is exactly the same as any
other HTTP header based authentication mechanism, except that it uses
the Cookie header instead of the Authorization or some other
proprietary header.
通过会话cookie,您可以将客户端状态存储在服务器上,因此您的请求具有上下文。让我们尝试将负载均衡器和另一个服务实例添加到您的系统中。在这种情况下,您必须共享服务实例之间的会话。很难维护和扩展这样的系统,所以它的规模很大......
在我看来,cookies没有任何问题。 cookie技术是一种客户端存储机制,其中存储的数据通过每个请求自动附加到cookie头。我不知道REST约束对这种技术有问题。因此技术本身没有问题,问题在于其使用。菲尔丁写了一个小节,说明为什么他认为HTTP cookie是坏的。
From my point of view:
-
authentication is not prohibited for RESTfulness (otherwise there'd be little use in RESTful services)
-
authentication is done by sending an authentication token in the request, usually the header
-
this authentication token needs to be obtained somehow and may be revoked, in which case it needs to be renewed
-
the authentication token needs to be validated by the server (otherwise it wouldn't be authentication)
你的观点非常可靠。唯一的问题是在服务器上创建身份验证令牌的概念。你不需要那个部分。您需要的是在客户端上存储用户名和密码,并在每次请求时发送它。除HTTP基本身份验证和加密连接之外,您不需要执行此操作:
您可能需要在服务器端使用内存中的auth缓存来加快速度,因为您必须对每个请求进行身份验证。
现在,由您所信赖的客户可以很好地工作,但第三方客户呢?他们不能拥有用户名和密码以及用户的所有权限。因此,您必须单独存储第三方客户端可以由特定用户拥有的权限。因此,客户端开发人员可以注册他们的第三方客户端,并获得唯一的API密钥,用户可以允许第三方客户端访问其部分权限。喜欢阅读姓名和电子邮件地址,或列出他们的朋友等...在允许第三方客户端之后,服务器将生成访问令牌。第三方客户端可以使用这些访问令牌来访问用户授予的权限,如下所示:
因此,第三方客户端可以从受信任的客户端(或直接从用户)获取访问令牌。之后,它可以使用API??密钥和访问令牌发送有效请求。这是最基本的第三方身份验证机制。您可以在每个第三方身份验证系统的文档中阅读有关实现详细信息的更多信息,例如:的OAuth。当然,这可能更复杂,更安全,例如,您可以在服务器端签署每个请求的详细信息,并将签名与请求一起发送,等等......实际的解决方案取决于您的应用程序的需要。
-
是的,你完全正确。自从我发布这个问题以来,我已经完全看到了这一点。在查看技术细节时,会话cookie并不是特别的,但是它缺少树木的森林。由于漂亮的图表,接受了你的答案。 ;)
-
我不确定是否所有这些都没问题。我在这里找到了一个更好的图表:i.stack.imgur.com/snQSG.png关于oauth。所以我认为授权必须是REST客户端和REST服务之间的一层,而REST服务不应该知道权限或其他任何内容。只有那样,我认为没关系。这种方法通过开发REST API来减少选项,但我认为它仍然可用。我尝试创建一个示例应用程序来证明ASAP。
-
好吧,我重新考虑过,REST服务的响应不应该依赖于授权,所以我认为前两个解决方案100%正常,如果服务仅使用信息来决定是否允许请求,那么其他解决方案都可以。不。所以我认为用户权限应该影响当前资源的表示。
-
我将创建一个关于表示的权限依赖性的问题。一旦我得到了正确的解决方案,我会尽快给出答案。
-
@ inf3rno,完全RESTful服务确实不能依赖会话cookie进行身份验证,就像传统方式一样。但是,如果cookie包含服务器稍后需要的所有状态信息,则可以使用cookie执行身份验证。您还可以通过使用公钥/私钥对进行签名来确保cookie不被篡改。请参阅下面的评论。
-
@jcoffland:是的,我同意。传统会话将应用程序状态和资源状态存储在服务器上的相同位置,因此使用它们并不安宁......使用cookie是另一回事。您在客户端存储cookie,因此它可以包含应用程序状态。
-
@jcoffland我正在运行一个SPA,在我看来,我没有任何方法可以在某个地方设置公共/私钥设置。我还听说过cookie数据存储所有权限的一些方案,通过加密/散列cookie(它们引用了AWS和HMAC),你可以节省很多db调用以验证权限。这些中的任何一个听起来可行吗
-
@DerekPerkins根据这篇文章,我正在使用防篡改cookie:hacks.mozilla.org/2012/12/非常有趣的东西。虽然有点具体。因人而异。
-
删除旧数字,简化了解释。
-
这个问题很难解决,我认为在实践中,工具必须是开发者服务而不是逆向,对我而言,Restful(与任何其他"工具"或工作方法一样)不是维基百科的定义。如果你必须简单地解决你的需求,那么无论你是否违反都没关系,如果你担心,那么发明一个新术语并称之为:有状态,我记得在九十年代可能纯粹主义者曾经说:绝对不!动态HTML,现在你看到......
-
@ElLocoCocoLoco关于REST是什么,什么不是,有一个非常好的定义。这里(我认为)唯一的问题是,人们懒得阅读Fielding论文,他们称之为REST,RESTful等等,它们使用资源和HTTP方法进行CRUD。 REST远不止于此。您的动态HTML示例是一个完全不同的问题,因为它是一项创新,而不是对描述良好的技术的误解。
-
@ inf3rno,我理解你的观点,人类需要定义,使他们感到更加舒适,这是我们的本性(试图定义每件事情并严格要求创造性的对立面的问题)。我的意思是。对不起,如果我不在这方面打开讨论主题。毕竟,我们不是计算机;)...有三个短语指导我的思考,无论别人怎么说:"最终证明手段","一切都是相对的"和"我不同意你的意思不得不说,但我会捍卫你的权利"。问候
-
一个完全偏离主题的子问题。这些图表,你用来为你的答案提供图像是可爱的。任何机会,你可以告诉秘密,哪个软件允许绘制如此神话般的图表?
-
@trejder yworks.com/products/yed
-
这个问题似乎假设会话存储在服务器上,当许多框架允许用户在数据库中存储会话时,使负载平衡工作得很好。如果使用这个,这不符合条件吗?
-
@Eckster通过REST,大多数客户端都在服务器端,因此答案取决于哪个服务器上的会话......通过巨大的负载,您需要水平扩展,有时在世界各地的多个不同位置。这意味着您需要以某种方式同步多个不同的会话存储。通过较小的负载,您可以使用单个服务器处理,存储会话以及资源状态不会对此造成太大影响。 OFC。这只是反对"服务器端会话"的一个论点,还有更多......
-
您说:"通过会话cookie,您将客户端状态存储在服务器上,因此您的请求具有上下文。让我们尝试将负载均衡器和另一个服务实例添加到您的系统。在这种情况下,您必须共享服务之间的会话实例。很难维护和扩展这样的系统"。但服务器验证用户名和密码是不是一样?
-
@SiminJie如果您在服务器端维护会话并且您有多个服务器,那么您必须在这些服务器之间进行同步,例如当其中任何服务器发生故障时,另一个服务器可以取而代之,而不会丢失任何会话数据。此会话同步是导致错误的水平可伸缩性的原因。在客户端上维护会话可以消除此问题。更快地进行用户名和密码验证并不是一个难题。例如,您可以在实际服务器上使用内存缓存。
-
@SiminJie我想你必须问问自己是否真的需要一个REST API。这通常不是合理的解决方案。我的意思是,大多数开发人员都不了解或关心许多限制因素。它需要大量的学习才能正确地完成它,并且只有通过非常大的服务才能获得有价值的优势。做你已经理解的事情要容易得多,并尝试一下爱好项目。
-
"此会话同步是导致水平可伸缩性差的原因。"用户名和密码同步不是导致水平可伸缩性差的原因吗?更新密码后,所有服务器都应该知道密码。
-
@SiminJie更新密码是一种罕见的事件。更新会话变量是一个经常发生的事件......
-
您如何看待频率控制的API密钥?这是会话还是令牌?
-
我不明白为什么每个人似乎都接受你应该在客户端存储密码的评论,并在每次请求时发送它们。这是一种非常糟糕的做法,会危及您的客户敏感数据。一个未散列的密码(它必须一遍又一遍地发送)不应该存储在任何地方。如果我们接受这个,那么你就像大多数身份验证系统一样使用令牌,在这种情况下,我们用来扩展令牌存储库的任何机制都将具有与任何会话可伸缩性大致相同的可伸缩性问题。
Cookie不用于身份验证。为什么重新发明轮子? HTTP具有设计良好的身份验证机制。如果我们使用cookie,我们只会使用HTTP作为传输协议,因此我们需要创建自己的信令系统,例如,告诉用户他们提供了错误的身份验证(使用HTTP 401会不正确,因为我们可能不会向客户端提供Www-Authenticate,因为HTTP规范要求:))。还应注意,Set-Cookie仅是对客户的推荐。其内容可能已保存,也可能未保存(例如,如果禁用了cookie),而每次请求都会自动发送Authorization标头。
另一点是,要获得授权cookie,您可能希望先在某处提供您的凭据?如果是这样,那么它不会是RESTless吗?简单的例子:
-
你尝试没有cookie的GET /a
-
你以某种方式获得授权请求
-
你会以某种方式授权POST /auth
-
你得到Set-Cookie
-
你尝试使用cookie GET /a。但GET /a在这种情况下是否表现得有意义?
总而言之,我相信如果我们访问某些资源并且我们需要进行身份验证,那么我们必须在同一资源上进行身份验证,而不是在其他任何地方进行身份验证。
-
与此同时,我也更加关注这一观点。我认为从技术上讲它没什么区别,它只是HTTP头。如果需要通过单独的地址登录,则认证行为本身不是RESTful。因此,cookie只是身份验证系统出现更大问题的一个症状。
-
这并不能说明Web浏览器仅支持Authorization: Basic或Digest这一事实。如果您想在浏览器上下文中执行比基本或摘要身份验证(并且您应该)更高级的任何事情,那么您将需要除Authorization标头之外的其他内容。
-
@OliverCharlesworth,即使在浏览器上下文中,我认为在Authorization标题中携带承载令牌也不是问题。
-
因为没有办法让浏览器使用承载令牌,例如页面请求。
-
@OliverCharlesworth,我认为当您直接从REST API请求HTML页面时,这是一种罕见的情况。在通常情况下,您有某种基于JS的客户端,它可以组成您喜欢的任何Authorization标头。
-
绝对 - 如果你正在使用纯JS,那么事情基本上就可以了(除了例如Websockets)。但我的观点是,基于API的身份验证不一定是浏览器场景中唯一的考虑因素。
-
没有cookie和cookie的GET /a显然是两个不同的请求,并且他们可以采取不同的行为。
实际上,RESTfulness仅适用于资源,如通用资源标识符所示。所以甚至谈论关于REST的标题,cookie等内容并不合适。 REST可以在任何协议上运行,即使它恰好通过HTTP进行。
主要的决定因素是:如果你发送一个REST调用,这是一个URI,那么一旦调用成功到达服务器,该URI就会返回相同的内容,假设没有执行转换(PUT,POST,DELETE) ?此测试将排除返回的错误或身份验证请求,因为在这种情况下,请求尚未进入服务器,这意味着将返回与给定URI对应的文档的servlet或应用程序。
同样,在POST或PUT的情况下,您是否可以发送给定的URI /有效负载,无论您发送消息多少次,它都将始终更新相同的数据,以便后续的GET将返回一致的结果?
REST是关于应用程序数据的,而不是关于传输数据所需的低级信息。
在下面的博文中,Roy Fielding总结了整个REST的想法:
http://groups.yahoo.com/neo/groups/rest-discuss/conversations/topics/5841
"一个RESTful系统从一个稳定状态发展到一个稳定状态
接下来,每个这样的稳态都是潜在的起始状态
和潜在的最终状态。即,RESTful系统是未知的
遵守一套简单规则的组件数量
始终处于REST或从一个RESTful转换
陈述到另一个RESTful状态。每个州都可以完全
通过它包含的表示和一组表达来理解
它提供的过渡,过渡限于a
统一的行动是可以理解的。系统可能是
一个复杂的状态图,但每个用户代理只能看到
一次一个状态(当前稳态),因此每个状态
状态简单,可以独立分析。用户,OTOH,
能够随时创建自己的过渡(例如,输入
URL,选择书签,打开编辑器等。)"
谈到身份验证问题,无论是通过cookie还是头文件完成,只要信息不是URI和POST有效负载的一部分,它根本就与REST无关。因此,关于无国籍,我们只讨论应用程序数据。
例如,当用户将数据输入GUI屏幕时,客户端将跟踪已输入的字段,哪些字段未输入,缺少任何必填字段等。这是所有客户端上下文,不应发送或跟踪由服务器。发送到服务器的内容是需要在IDENTIFIED资源中(通过URI)修改的完整字段集,以便在该资源中从一个RESTful状态转换到另一个RESTful状态。
因此,客户端会跟踪用户正在做什么,并且只向服务器发送逻辑上完整的状态转换。
HTTP事务,基本访问认证不适用于RBAC,因为基本访问认证每次都使用加密的用户名:密码来识别,而RBAC中需要的是用户想要用于特定呼叫的角色。
RBAC不会验证用户名的权限,而是验证角色的权限。
你可以这样连接:usernameRole:password,但这是不好的做法,而且效率也很低,因为当用户拥有更多角色时,身份验证引擎需要在连接中测试所有角色,并且每次调用都需要。这将破坏RBAC最大的技术优势之一,即非常快速的授权测试。
因此,使用基本访问身份验证无法解决该问题。
要解决这个问题,会话维护是必要的,根据一些答案,这似乎与REST相矛盾。
这就是我喜欢REST不应被视为宗教的答案。例如,在复杂的商业案例中,在医疗保健领域,RBAC绝对是常见且必要的。如果他们不被允许使用REST,那将是一个遗憾,因为所有REST工具设计师都会将REST视为宗教。
对我来说,通过HTTP维护会话的方法并不多。可以使用带有sessionId的cookie或带有sessionId的头。
如果有人有另一个想法,我会很高兴听到它。
会话不是RESTless
你的意思是REST服务仅供http使用,还是我的错误?基于Cookie的会话必须仅用于自己的(!)基于http的服务! (使用cookie可能会出现问题,例如来自Mobile / Console / Desktop /等)。
如果您为3d party开发人员提供RESTful服务,请不要使用基于cookie的会话,而是使用令牌来避免安全性问题。
-
cookie不应该用于存储保存身份验证令牌的服务器上的会话的会话密钥。但如果cookie持有身份验证令牌,那么这是一个可行的解决方案。 (当然,cookie应该是httponly和安全的)