在讲Cookie + Session 登入前,我们应该先来了解一下,为什么会有这两个东西:
成都创新互联2013年至今,先为丹棱等服务建站,丹棱等地企业,进行企业商务咨询服务。为丹棱企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。因为HTTP 是一种無狀態 (stateless) 的协议,所以每次请求都是獨立的,伺服器端无法判断本次请求和上一次请求是否来自同一个使用者,进而也就无法判断使用者的登入状态。
那你可能会好奇,那为什么要無狀態 (stateless) 的協議?你要想如果我们需要存储大量的使用者状态,就会造成很大的伺服器端维护成本,所以如果可以客户端、伺服器、资料库都不去储存使用者状态,那不是很棒?所以 無狀態 (stateless) 的協議 就诞生了
这边举个网路上普遍的例子:Cookie 就是會員卡,浏览器可以透过Cookie 去知道使用者状态,就好像会员卡能知道你的购买记录一样
简单来说,就是伺服器透过 Header 的属性Set-Cookie,把使用者的状态纪录成储存在使用者电脑里的Cookie,而浏览器在每一次发送请求时,都在 Header 中设定 Cookie 属性,把 Cookie 自动带上,伺服器就能藉由检视 Cookie 的内容,得知浏览器使用者的状态
前面有提到 Header 能够透过 Set-Cookie 把使用者的状态纪录成储存在使用者电脑里的 Cookie 那我们现在来看一下Set-Cookie 的内容跟一些可客制化的属性:
domain:Cookie的有效domain(如果未设定,就会自动绑在执行Set-Cookie 的domain 下)
path:可以指定 Cookie 只在特定路径下生效,未设定预设为'/'
Max-Age:有效期限,单位是秒;当数值为正数时有效,负数时为本次Session 有效;0 为删除Cookie
Expires:同上,只是指定的是时间点(如果没有明确设定的话,就是在关闭浏览器前失效)
secure:安全性,当这个属性被设为true 时,此Cookie 就只会在「安全的协议」下传输,通常为HTTPS
HttpOnly:只能在网路传输中使用,当设为true 时,此Cookie 就无法在任何JavaScript 程式码中取得
// 取得当前的 cookie
console.log(document.cookie)
// 写入 cookie,myName 栏位写入 jan
document.cookie = 'myName=jan'
// 写入 cookie,并加入过期时间
document.cookie="myName=jan; expires=Mon, 04 Dec 2017 08:18:32 GMT; path=/"
// 写入 cookie,设定 10 秒后失效
Cookie + Session 登入
扯了这么多,回到登入部分,使用Cookie + Session 登入的流程大概是:
client端发送一个http request 到server 端
server 接到request 后,建立一个session,并传送一个http response 回client端,而这个response 包括Set-cookie 的header,里面存有sessionID。
当client端发出第二次request 后,若server 给了Set-cookie,浏览器会自动在request 中加入cookie。
server 接受request,解析并验证cookie,若验证成功就回传response 给client 端;失败则回除错误码。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧