我们进入B站首页,无需输入账号密码,甚至不用点登录,我们就自动登陆了,其实这就是Cookie在起作用。
目录
1、验证Cookie信息保存在浏览器中(认识Set-Cookie属性)
2、验证浏览器的请求携带Cookie信息(认识Cookie属性)
一、初识 Cookie
1、什么是Cookie
Cookie可以看作是一个文件,这个文件里保存了用户的私密信息,如登陆某个网站的账号和密码。
2、Cookie有什么用
就像最开始说的,有了Cookie,我们在访问一些网站的时候无需填写账号和密码便可以直接登录,登录一个网站的时候会推荐我们想看的信息,一定程度上提升了用户体验。
3、Cookie文件在哪
http协议并不会保存历史请求,它只关注当前收到的请求,所以可以肯定的是,Cookie文件不在服务端。现在只剩下一个答案,那就是在浏览器中,而且Cookie文件是跟网站绑定的
每次访问B站首页的时候,首页会给我们推荐我们想看的内容;但是访问腾讯新闻首页的时候,可能推荐的内容又不一样,因此,浏览器的每个网站保存了该网站对应的Cookie文件!
4、使用Cookie自动登录的过程
(1) 预备知识
http协议:虽然http协议不保存历史请求,但能够识别Cookie信息
浏览器:浏览器的某个网站如果包含Cookie信息,那么在向服务器发送请求的时候会自动携带Cookie信息。
(2) 自动登录的过程
当我们第一次登录B站的时候,我们需要输入账号和密码,登录成功以后,服务端返回网站资源,此时响应头中会包含Set-Cookie属性,浏览器能识别该属性,然后会给这个网站添加Cookie文件。这样的话,该网站就有了对应的Cookie文件了。
后续发送登录请求的时候,请求中就会携带这些Cookie信息(登录的账号和密码),服务端识别到了Cookie,同时验证通过的话,此时服务端就会返回登录以后的页面。
至于有的时候为什么自动登录会失效?答案是Cookie可以设置到期时间
二、代码验证Cookie的存在
在第一次访问某个网站的时候,服务端可以主动给这个网站添加Cookie信息,下一次浏览器再次请求这个网站的时候,就会携带之前添加的Cookie信息。下面我们的验证分为两步,第一步是先给网站添加Cookie信息,在浏览器中查看该网站是否包含了Cookie信息;第二步重新访问这个网站,在服务端查看请求是否包含Cookie信息。
1、验证Cookie信息保存在浏览器中(认识Set-Cookie属性)
既然要给网站设置Cookie信息,这里就需要认识请求头的Set-Cookie属性了,Set-Cookie属性的值必须是键值对的形式,该属性的使用方式如下:
Set-Cookie: id=gzx\n;
Set-Cookie: passwd=123456\n; //请求头里可以添加多个Set-Cookie属性
服务端的局部代码如下:
std::string http_response = "http/1.0 200 OK\n"; //构建响应
http_response += "Set-Cookie: id=gzx\n"; //设置Cookie信息
http_response += "Set-Cookie: passwd=123456\n";
http_response += "\n";
send(sock,http_response.c_str(),http_response.size(),0); //服务器发送响应
2、验证浏览器的请求携带Cookie信息(认识Cookie属性)
接下来需要验证,再次请求这个包含Cookie信息的网站时,发送的请求会携带Cookie信息,此时请求头里就会出现一个Cookie属性,让服务端知道,请求中携带了Cookie信息。我们刷新一下上面的网站,服务端将收到的请求打印出来,我们可以看到Cookie属性包含了我们之前设置的Cookie信息。
三、Cookie文件存在的安全隐患
我们发送的请求其实是可以被第三方拦截或者监听的,因此如果我们发送的请求携带了Cookie,此时第三方就可以获取到我们的Cookie信息,然后以我们的身份访问特定的资源。若我们保存的是用户名和密码这样的私密信息,那么后果就很严重了,因此,一般不会单纯的使用Cookie。
为了应对这种隐患,我们提出了 session,即会话管理,session的核心思路是:既然私密信息保存在浏览器中不安全,那么我们就把私密信息保存在服务端。
四、认识Session
为了缓解私密信息泄漏的风险,我们提出了Session,Session也叫会话管理,在用户第一次登录时候,就将用户的私密信息(如账号密码等)存储在服务端。
第一次登录B站的时候,也是需要传递账号和密码的明文信息,此时会在服务端形成一个Session文件用于保存用户的私密信息,响应头中Set-Cookie属性对应的值就是Session文件的id,下面统一称为sessionId。
在后续的登录过程中,浏览器发送请求时,携带的只是sessionId,即便是被拦截了,第三方拿到的也只是sessionId,一定程度上缓解了私密信息泄漏的风险,但风险依然存在。如果第三方带着我们的sessionId去请求对应网站的内容,依然可以请求到。
只不过现在有了手机验证码的存在,即便是有了sessionId,服务端检测到异地登录的话,会要求你输入手机验证码,这样的话就进一步保护了我们的私密信息,不允许第三方轻易登录。