https化的大潮中,大多网站不是一步到位的,基于各种原因,并不会强制https访问,大多同时存在过http/https均可访问的情况。

前段时间碰到过由此引起的一个cookie传递问题,值得记录一下:
问题的表现是:在用户在https访问的情况下登录了账号,这时候如果回到http版本,则并没有登录,而且重新登录也登不上去!

与登录相关的,首先想到的当然是cookie的问题,仔细调试才发现,在https访问的情况下,设置cookie,会多带了一个secure的属性,而http访问则不会带。

这个属性是一个布尔值,真或者假,为真时表示这个cookie值只在htts的情况下,才会随着请求一起发送给服务器。这个属性不太容易被重视到,因为一般来说设置cookie参数可能只会关注到域名、路径、过期时间等属性,而且这个secure属性,默认是false,也不会引发什么问题。

但如果网站同时允许https和http访问,并且在设置cookie时把访问协议考虑其中,例如通过是https或者443端口访问时,设置cookie是让secure为true。这样的出发点本来是好的,但是却引发一个问题:如果有用户先是通过http访问,并在一些交互过程中,给浏览器种下了cookie,此时secure为true,如果此时由于某种原因,用户通过https访问,则之前的设置的cookie则不会携带。这也就是为什么,在https环境下登录的用户,到了http,却自动退出了,其实并没有退出,只是secure设为了true,cookie没有传递。

需要小心,特记录一下。