• Cookie与Session详解


    Cookie是什么?

    Cookie是服务器发送到用户浏览器,并保存在本地的数据,它会在浏览器下次向服务器发起请求时被携带上。

    Cookie主要用来处理:

    • 会话状态管理
    • 个性化设置
    • 浏览器行为跟踪

    这里我们可以随便找一个网站看看请求中的cookie,我这里获取steam首页的请求cookie。

    Accept: */*
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9
    Connection: keep-alive
    Cookie: browserid=2493276064918902816; timezoneOffset=28800,0; _ga=GA1.2.147267860.1613790599; recentapps=%7B%221144200%22%3A1613792183%2C%221384970%22%3A1613790690%7D; steamCountry=CN%7C2298a90b2faf70fddc5943f169b45264; sessionid=708341a7880d357002790875; _gid=GA1.2.1426367989.1614568926; app_impressions=107410@1_4_4__129_1
    Host: store.steampowered.com
    Referer: https://store.steampowered.com/
    sec-ch-ua: "Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"
    

    从cookie数据我们可以简单猜测:

    • browserid:浏览器id
    • timezoneOffset:时区
    • steamCountry:区域

    Session是什么?

    Session 代表着服务器和客户端一次会话的过程。Session 对象存储特定用户会话所需的属性及配置信息。

    同样是上面steam的数据,我们可以看到cookie中有一个session_id参数,我们可以大胆的猜测一下,steam服务端根据这个seesion_id对应的保存一些数据。

    Cookie和Session的区别?

    • Cookie保存在客户端本地,session保存在服务端。
    • Cookie只能保存ASCII,seesion可以保存任意数据类型。
    • Cookie可以甚至为长时间有效,session有超时时间。
    • 由于Session保存服务端,数据安全性比Cookie好。
    • Cookie需要在请求时,添加在header头中,大小不能超过4K,session没有这个限制。

    Cookie和Session的来历与关联?

    来历

    1)很久以前,web基本上就是文档的浏览,对于服务器来说,每一次请求都是一个新的HTTP协议。

    2)遇到一些针对参数需要不同处理的逻辑,就引入了Cookie,Cookie会在发起请求时添加一些参数,告诉服务端必须参数。

    3)Cookie参数操作部分的限制,上面已经说了,所以进一步引入了Session。

    关联

    Session数据与sessionid一一对应,而session_id一般放在cookie中传输。这里参照知乎的图:
    90%程序员面试时都没有完全答对Cookie和Session的区别

    用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建创建对应的 Session ,请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器,浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionID 属于哪个域名。

    当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息,如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,如果没有找到说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作。

    Session传送

    依靠cookie传递session_id是否是可靠的呢?毫无疑问是不可靠的,如果浏览器禁用了cookie,服务器将无法正常获取数据。那么我们是否还有其它的方法可以传输呢?

    • params:在url上,作为参数进行传递
    • body:放在body消息中,进行传递
    • header:可以考虑根据token来获取session_id

    Session共享

    现在大部分的服务器都使用上了集群+分布式,面对cookie这种由客户端传的参数,请求到A或者B都无所谓。但是如果Session只保存在A节点上,请求发送到了B节点的话,就会因为数据缺失而出现一些问题。如登陆失效,应对这种情况,我们可以采用以下几种方式:

    • ip-hash:添加代理服务器,负载均衡算法使用ip哈希,将同一个ip发送的请求转向同一台服务器。(不推荐,单点故障的话还是会出现问题)
    • session复制:任何一台服务器上session的操作都同步到其余所有的服务器。(不推荐,数据同步的维护困难)
    • session共享:将用户的 Session 等信息使用缓存中间件来统一管理,保障分发到每一个服务器的响应结果都一致(推荐)

    参考链接:知乎-无言讲编程

    作者:红雨
    出处:https://www.cnblogs.com/52why
    微信公众号: 红雨python
  • 相关阅读:
    mysql 初始密码 设置
    jsp基础知识(基本的语法及原理)
    hdu 2473 Junk-Mail Filter (并查集之点的删除)
    java版本的学生管理系统
    java操作数据库出现(][SQLServer 2000 Driver for JDBC]Error establishing socket.)的问题所在即解决办法
    Java学习之约瑟夫环的两中处理方法
    hdu 3367(Pseudoforest ) (最大生成树)
    hdu 1561 The more, The Better (树上背包)
    Nginx + Lua 搭建网站WAF防火墙
    长连接和短连接
  • 原文地址:https://www.cnblogs.com/52why/p/14470149.html
Copyright © 2020-2023  润新知