【发布时间】:2013-11-14 16:37:53
【问题描述】:
我正在开发一个 RESTful API,并且我已经实现了 OAuth 2.0 授权。
我的所有客户端都通过 SSL 发出请求,并在 Authorization 标头中传递不记名令牌:
Authorization: Bearer sdflksd3r4823vgbyerge
目前我在 Postgres 中保存访问令牌和刷新令牌,因此在每个请求中服务器都必须连接到数据库并执行 SELECT 查询。 'tokens' 表包含大约一百万行,所以 性能不是很好,即使该表被索引...我也认为在每个请求上检查令牌有效性是相当浪费的时间。
我们的令牌现在只是随机的数据字节。我们考虑使用自编码令牌,以便无需数据库查找即可解码和验证令牌,但问题是令牌必须对用户可撤销,因此这不是解决方案。
我有什么选择?
我正在考虑使用 Redis 代替 Postgres:读取速度应该更快。 另一种选择可能是检查令牌有效性,将响应缓存在 Memcached 中 15 分钟,因此后续请求不需要数据库查找。
有什么想法吗?
【问题讨论】:
-
“性能不是很好”这句话实际上并没有告诉我们太多信息。您什么时候查看令牌?为什么服务器连接到数据库只是为了这个查询?不过,像 memcache 这样的东西非常适合检查身份验证令牌。
-
嗨@RichardHuxton 在实施oauth 之前对我的api 的“典型请求”的响应时间为0.200 秒......现在相同的请求大约需要0.800 秒。显然,这些响应时间还不错,还可以……但我至少想尝试减少它们,所以我想也许 postgres 不是存储令牌的最佳解决方案……
-
600ms 对于简单的查询来说听起来不合适。不过不能肯定地说,因为您没有提供任何硬数据或设置的详细信息。如果您有一个每年 5 美元的盒子在与您的应用程序不同的大陆上运行,那么它会非常快。
-
@RichardHuxton 我正在使用 ec2 微实例,数据库与应用程序服务器位于同一台机器上
标签: api security postgresql rest oauth