【问题标题】:API User Session SpringAPI 用户会话 Spring
【发布时间】:2011-07-08 08:19:36
【问题描述】:

我正在通过 Spring MVC 中的 Web 服务开发 API。用户必须进行身份验证,并在客户端浏览器中设置 cookie。现在这个 API 将不在同一个域上,所以我需要一种方法来知道客户端上的会话何时超时,因为他们将在登录后发出 API 请求。什么是最好的安全方法?将信息存储在会话、缓存、数据库中以与服务器上的请求 cookie 进行比较?

【问题讨论】:

    标签: web-services api session cookies spring-security


    【解决方案1】:

    在我的例子中,我为成功通过身份验证的用户生成了一个唯一的身份验证令牌。每次用户需要调用任何 Web 服务时,他们都需要传递身份验证令牌。

    我的身份验证令牌已生成,如下所示:-

    Date creationDate = new Date();
    String key = UUID.randomUUID().toString().toUpperCase() + "|" + userName + "|" + creationDate.getTime();
    String authenticationToken = ... // encrypt key with Jasypt
    

    我附加了创建日期,因为它允许我检查生存时间。每次用户调用任何 Web 服务时,我都会使用创建日期检查空闲持续时间。如果空闲时间少于 30 分钟,我将空闲时间重置为零并允许用户执行 Web 服务。但是,如果用户闲置超过 30 分钟,我认为身份验证令牌无效,他们必须重新进行身份验证才能获取新令牌。

    【讨论】:

    • 好主意。这对任何形式的劫持安全吗?也许将IP存储在密钥中,并在服务器端进行检查?我什至需要在数据库中存储任何东西吗?在我给你支票之前会等待更多的答案。
    • 您当然可以附加 IP 或任何有用的信息,以使您的密钥更加独特。这将允许您执行更强大的检查以确保用户是正确的用户。就我而言,我必须将空闲持续时间存储在数据库中,因为我在集群环境中运行,因此将这样的数据存储为static map 效果不佳。这是一个非常简单的数据库表,其中包含身份验证令牌、用户名、创建日期、上次访问日期和总访问次数(用于审计目的)。
    • 我对前段时间写的一个 api 使用了类似的方法。它很容易实现,我真的很喜欢这个原理。如果通过网络明文发送确实很容易受到攻击,但风险受限于令牌的有效期,如果过于敏感,则应在客户端和服务器之间使用 HTTPS。..
    • 您是否使用新的日期重新创建令牌以便下次检查?
    • 不,每个用户会话只创建一次令牌。然后,用户可以对该会话中的多个请求使用相同的令牌。当您检查数据库时,您只需要检查该令牌的最后一次身份验证日期时间。如果有效,则用当前日期时间更新上次验证的日期时间,然后允许用户继续请求。
    猜你喜欢
    • 1970-01-01
    • 2017-06-12
    • 2019-09-13
    • 1970-01-01
    • 2017-12-09
    • 2014-12-25
    • 2012-01-21
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多