Session 为资源提供服务时的外部请求数

Session 为资源提供服务时的外部请求数,session,server-side,Session,Server Side,因此,我有一个web应用程序,它向服务器发出大量数据请求。项目要求具有非常快的服务器响应时间。服务器托管在基于云的平台上 该应用程序使用会话跟踪用户登录后的身份验证。因为它托管在云提供商上,所以我使用缓存来备份会话存储(在我的例子中,它是Auzre缓存,但如果您不熟悉,请考虑Redis) 电流如下所示: public void Get(){ var authHeader = Request.Headers["CustomAuth"]; if(!validate(authHeade

因此,我有一个web应用程序,它向服务器发出大量数据请求。项目要求具有非常快的服务器响应时间。服务器托管在基于云的平台上

该应用程序使用会话跟踪用户登录后的身份验证。因为它托管在云提供商上,所以我使用缓存来备份会话存储(在我的例子中,它是Auzre缓存,但如果您不熟悉,请考虑Redis)

电流如下所示:

public void Get(){
    var authHeader = Request.Headers["CustomAuth"];
    if(!validate(authHeader)){
        Response.StatusCode = 404;
        Response.End();
    }else{
        //something else
    }
}
  • 用户访问一个资源
  • 正在尝试通过缓存基于会话ID获取会话。这是一个缓存请求
  • 用户通过会话状态进行身份验证(如果已登录)
  • 通常通过缓存发送数据请求
  • 数据将返回给用户
这种方法的问题在于它会两次命中缓存。完全取消会话可显著提高速度(约50%)

我在考虑访问缓存一次,要求用户提供我需要的密钥和SessionID以节省额外的往返时间。然而,我以前从未见过这种方法,它需要“滚动我自己的会话”,因为我必须生成会话ID等等。我觉得可能有一个更简单,更容易的方法

那么,向用户提供资源并对其进行身份验证的最有效方法是什么?

注意:我将ASP.NET MVC/WebAPI与C结合使用,但我觉得这与问题不太相关,因此我将语言和平台排除在问题之外。

您可能希望将身份验证和资源请求步骤合并到一个请求中。这不仅更快,而且比您的实现更安全。考虑下面的场景:

  • 用户向服务器进行身份验证。结果就是成功
  • 身份验证已更改。(例如,用户更改密码,管理员决定锁定用户帐户等)
  • 用户在步骤1中使用sessionID发出请求
  • 为了确保用户没有被授予对资源的访问权限,您需要在步骤3中准确地对用户进行身份验证。但这没有意义,您之前已经在步骤1中对该用户进行了身份验证

    HTTP的核心就是这样设计的。有多种方式可以随请求传递身份验证信息,例如:

  • 在内容中写入身份验证信息(愚蠢,但有效)
  • 在url中包含身份验证,例如example.com/pic/123?sessionID=abc(更好,但会使您的url变长变丑)
  • 在cookie中存储会话信息(更好,但是如果客户端不支持cookie怎么办?cookie过期怎么办?)
  • 验证HTTP头(我个人的最佳推荐)
  • HTTP本身有一个与“基本身份验证”兼容的authenticate头(定义良好,如果您感兴趣,可以查找)。但是您可以实现自己的自定义头

    任何缓存查找都会很慢(与计算相比),因此您应该同时忽略身份验证部分的缓存。你的服务器应该是无状态的;i、 e.不要跟踪登录会话。如何知道sessionID是否有效?在上面贴上时间戳。为了避免其他人伪造sessionID,也要签名

    因此,您的HTTP请求看起来像这样(伪代码):

    实现您自己的签名方法,有点像散列函数(您可以使用HMAC),并将密钥安全地保存在服务器上。如果签名匹配,则您知道您以前在登录时已对此进行了签名,并且必须来自您的服务器。时间戳有助于检测会话过期,并防止重播攻击

    现在在服务器中,执行以下操作:

    public void Get(){
        var authHeader = Request.Headers["CustomAuth"];
        if(!validate(authHeader)){
            Response.StatusCode = 404;
            Response.End();
        }else{
            //something else
        }
    }
    
    如果您需要在一个请求中执行登录+会话身份验证+资源请求,那么只有两种身份验证方法。用户可以提供用户名/密码组合,也可以提供会话密钥。考虑一下这个场景,它来自我使用的一个API:

  • 用户注册用户名/密码组合
  • 服务器响应注册成功/失败(例如用户名已被使用)
  • 如果成功,用户现在可以使用用户名/密码组合登录
  • 服务器返回会话令牌
  • 如果我们这样做,会不会更简单(更快):

  • 用户注册用户名/密码组合
  • 如果是成功,请回答“reg success”和“sessionToken=xxxxxx”。如果是故障,则响应“reg failure”

  • 我希望这能让您有所了解。

    此外,您可以通过修改/限制服务器上的设置来删除服务器端的身份验证,以满足仅来自web应用所在ip的请求。您的web应用程序仅在其已验证的情况下才允许请求传递到服务器,因此到达数据服务器的所有请求都将自动提供,而无需检查任何验证。在这种情况下,您只需点击一次缓存,即可检查用户是否已通过身份验证,并立即点击服务器。

    我同意此处所述的一般想法,即保持无状态,宁愿使用CPU绑定的身份验证而不是IO绑定的身份验证,因此放弃缓存进行身份验证。然而,我会选择使用HTTP身份验证,而不是使用HTTP身份验证。它比HTTP身份验证功能强大得多,特别是因为它不限制您使用HTTP。