Flask会话,cookie存储在哪里?

12

我正在学习Flask并希望了解会话(session)的工作原理。显然,服务器会将已签名的Cookie存储在客户端浏览器上。我已经使用过这个过程。

sessions['mycookie'] = 'mycookievalue'

但我找不到浏览器中的cookie。我通常使用Chrome开发者工具列出浏览器上的cookie,运行以下命令:


但我无法在浏览器中找到 Cookie。我通常使用 Chrome 开发者工具列出浏览器上的 Cookie,并运行以下命令:
document.cookie
当我设置一个cookie时,这个方法可以使用,但是当我通过sessions设置时,什么都没有出现。

Flask 在浏览器中使用 KEY 'session' 存储会话 ID。 - Hassan Mehmood
1
@HassanMehmood:默认实现将所有会话数据存储在(已签名的)cookie中。 - Martijn Pieters
3个回答

13

Flask会话cookie设置了httponly标志,使其在JavaScript中不可见。

它是一个普通的常规cookie,因此仍然存储在浏览器cookie存储中;您仍然可以在浏览器的开发人员工具中查看它。

如果您想从JavaScript代码中访问cookie值,可以将SESSION_COOKIE_HTTPONLY选项设置为False。来自Builtin Configuration Values部分:

SESSION_COOKIE_HTTPONLY
  控制是否应使用httponly标志设置cookie。默认为True

该cookie包含所有您的会话数据,使用JSON进行序列化(支持标记以支持更广泛的Python类型),以及一个加密签名,确保数据无法被安全地篡改。

如果禁用httponly保护,任何JS代码仍然可以解码和读取您的所有会话数据。即使它不能更改这些值,对于恶意代码来说,这仍然可能非常有趣。想象一下,在您的站点中发现一个XSS漏洞,因为JS代码可以直接从会话中读取用于保护Web表单的CSRF令牌,使情况变得更糟。


Martijn,谢谢您的回复。是的,这很有道理。我成功地在进入Chrome设置后看到了Cookie。 - Karim Lameer
@Martijn Flask会话创建的cookie和您可以在Flask中为响应对象分配的“常规”cookie之间的唯一区别是存储在其中的数据吗?使用会话的cookie是否比通过response.set_cookie(key/value)创建cookie并将其附加到响应对象更好?http://flask.pocoo.org/docs/0.11/quickstart/#cookies - AdjunctProfessorFalcon
1
@Malvin9000,区别在于Flask已经为您解决了如何序列化数据结构以及数据完整性的问题。您可以自己完成所有这些工作并直接将其存储在cookie中,但是为什么要自己做呢?除非您需要与其他系统共享cookie,否则我建议您使用session。 - Martijn Pieters

8

我在3年8个月后发现了这个问题,因为我对其被修改或欺骗的事件很感兴趣,以确保我的后端能够区分出差异。

使用Chrome浏览器,按下F12,在Application选项卡中,在Storage下面找到Cookies。在Cookies下面,您会找到网页,选择它,右侧将填充内容,并假设您已经执行某些操作来创建会话cookie,则会话cookie将出现在其中。您会注意到该值是加密的。

显示会话cookie位置的图片


1
谢谢你的照片 :) - chhantyal

1
会话仅供服务器使用,这就是为什么它对客户端进行隐藏和加密的原因。 如果您想设置一个可以被客户端/浏览器使用的cookie,您可以设置一个普通的cookie而不是安全cookie(如会话)。 您可以通过修改响应来设置cookie。
def home_page():
   resp = make_response(...)
   resp.set_cookie('my_cookie', 'cookie_value')
   return resp

在浏览器上,document.cookie 可以给你 mycookie=cookie_value

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接