我正在使用Spring 4 mvc
数据库,mysql
服务器处理tomcat
应用程序。
基本上,我正在创建一个将由Angular JS
使用的Spring休息。
注意:我没有使用Spring security
为了避免在clustered environment
的情况下进行会话复制,我使用cookie
方法。登录时,我正在生成one unique session id
(using java UUID
)并将其用于创建一个cookie
,然后在响应中设置cookie。同时,将该会话ID与任何用户数据一起存储在数据库中。
为了验证每个rest API,我编写了一个Spring interceptor
来拦截每个其余的API调用,然后检查请求中是否有cookie。如果它存在,我将获取会话ID值并使用它,进行数据库调用以检查它是否有效。注销时,我正在删除cookie。
基于我正在做的事情,如上所述,我几乎没有问题:
1) Is my approach correct? or do you see any flaw in it.
2) Let me know if there is any other better method to achieve the same i.e. to avoid session replication.
3) Since, I am not using any HTTP session, how do I achieve something like session-timeout or do i even need it?
答案 0 :(得分:0)
1)我的方法是否正确?或者你看到它有任何缺陷。
这是一个很好的方法。只是按优先顺序排列几点: -
如果您使用API来处理 很多 请求,那么请考虑使用内存缓存而不是DB。去DB比较昂贵。 Alot 是我认识的主观,这取决于您的设置,但只考虑数据库中您希望在会话之外生活的数据。最好使用更临时/更快的存储,例如内存缓存,用于API令牌等。如果跨群集,则浏览分布式缓存解决方案。
使用Cookie不一定是安全风险,但对CSRF有一点了解。在HTTP标头中而不是在cookie本身中传递令牌更安全 - 也就是说你关心CSRF(我在我自己的应用程序中使用Header方法但我认为CSRF相对较少,这取决于你的敏感度数据是)
2)让我知道是否还有其他更好的方法来实现同样的目标 即避免会话复制。
没有任何内容可以添加到响应1。)
3)因为,我没有使用任何HTTP会话,我如何实现会话超时或我甚至需要它?
存储(最好在缓存中)带有令牌的时间戳,并在缓存中为使用该令牌的每个事务刷新它。然后,在检查您是否考虑令牌有效时,请检查时间戳,如果您希望删除令牌并请求客户端重新进行身份验证,您可以决定(根据已用时间)。