1. Cookie/Session?
1.1Cookie简介
HTTP/1.1 引入 Cookie 来保存状态信息。Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器之后向同一服务器再次发起请求时被携带上,用于告知服务端两个请求是否来自同一浏览器。由于之后每次请求都会需要携带 Cookie 数据,因此会带来额外的性能开销。Cookie具有不可跨域性,Cookie在客户端是由浏览器来管理的,浏览器只允许一个网站操作对应域名的Cookie。
用途:会话状态(登录状态,购物车等),个性化设置,浏览器行为跟踪
创建:服务器发送的响应报文包含 Set-Cookie 首部字段,客户端得到响应报文后把 Cookie 内容保存到浏览器中。
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
[page content]
客户端之后对同一个服务器发送请求时,会从浏览器中取出 Cookie 信息并通过 Cookie 请求首部字段发送给服务器。
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
1.2Session及二者区别
Cookie保存在浏览器,Session保存在服务器端(Session 可以存储在服务器上的文件、数据库或者内存中。也可以将 Session 存储在 Redis 这种内存型数据库中,效率会更高。),但是为了区分不同的客户端,服务器返回的响应报文的 Set-Cookie 首部字段包含了这个 Session ID,客户端收到响应报文之后将该 Cookie 值存入浏览器中,下次客户端之后对同一个服务器进行请求的时候会包含该Cookie值,服务器收到之后取出SessionID,从服务器端取出用户信息,继续业务操作。所以Session机制依赖于Cookie机制。
1、Cookie不是很安全,存储在浏览器中,容易被恶意查看。(如果非要将一些隐私数据存在 Cookie 中,可以将 Cookie 值进行加密,然后在服务器进行解密)
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
a.浏览器通过 document.cookie 属性可创建新的 Cookie,也可通过该属性访问非 HttpOnly 标记的 Cookie。站脚本攻击 (XSS) 可使用它窃取用户的 Cookie 信息。
b.标记为 HttpOnly 的 Cookie 不能被 JavaScript 脚本调用。
c.标记为 Secure 的 Cookie 只能通过被 HTTPS 协议加密过的请求发送给服务端。
2、Cookie 只能存储 ASCII 码字符串,而 Session 则可以存储任何类型的数据,因此在考虑数据复杂性时首选 Session。
3、Session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能考虑到减轻服务器性能方面,应当使用Cookie。
4、单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、建议:将登陆信息等重要信息存放为Session,其他信息如果需要保留,可以放在Cookie中。
浏览器禁用Cookie,则只能用Session,使用 URL 重写技术,将 Session ID 作为 URL 的参数进行传递。
2. 保存登录状态?
1、把登录信息如账号、密码等保存在Cookie中,并控制Cookie的有效期,下次访问时再验证Cookie中的登录信息即可。
2、把密码加密后保存到Cookie中,下次访问时解密并与数据库比较。
3、把登录的时间戳保存到Cookie与数据库中,到时只验证用户名与登录时间戳就可以了。
4、把账号按照一定的规则加密后,连同账号一块保存到Cookie中。