Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在浏览器cookie中存储API密钥有什么缺点吗?_Javascript_Api_Security - Fatal编程技术网

Javascript 在浏览器cookie中存储API密钥有什么缺点吗?

Javascript 在浏览器cookie中存储API密钥有什么缺点吗?,javascript,api,security,Javascript,Api,Security,我们有一个带有json API的应用程序。我们在浏览器中使用Javascript向其发送ajax调用。每个API调用都需要一个API密钥 我计划实现一个登录API,该API将接受用户名和密码,并返回该特定用户的API密钥。密钥将放入cookie中,并随每个API请求一起传回。(您仍然可以将其包含在json请求中;cookie将是一个后备方案。) 这个方案的最大好处是我们不需要在服务器端维护会话。服务器端的一切都是无状态的。当您处于集群环境中时,无状态操作有很大的好处 这是个坏主意吗?安全吗?有更

我们有一个带有json API的应用程序。我们在浏览器中使用Javascript向其发送ajax调用。每个API调用都需要一个API密钥

我计划实现一个登录API,该API将接受用户名和密码,并返回该特定用户的API密钥。密钥将放入cookie中,并随每个API请求一起传回。(您仍然可以将其包含在json请求中;cookie将是一个后备方案。)

这个方案的最大好处是我们不需要在服务器端维护会话。服务器端的一切都是无状态的。当您处于集群环境中时,无状态操作有很大的好处

这是个坏主意吗?安全吗?有更好的办法吗


假设我们是通过https运行的。

如果您不需要对旧浏览器的支持,并且您只需要访问api密钥客户端,那么您可以使用本地存储,这样您就不必向服务器发送cookie,也不必从服务器发送cookie,也不会有cookie被盗。

不,您提到的方式,即使使用https,您的API密钥也不安全。这是因为API密钥现在存在于您的浏览器中,很容易被浏览器插件、脚本等暴露

另外要考虑的是,令牌的有效期是多长。在这种情况下,建议使用较短的API令牌过期时间

幸运的是,很多人都有相同的需求,OAuth 2规范有一个隐式的授权案例流,只适用于您提到的用例。你可以看看这个然后决定你的方法


我相信这会让用户容易受到会话劫持的影响。您仍然可以通过XSS或嗅探api请求来窃取会话。与cookie方法没有太大区别,它只是不会发送到不需要密钥的页面。