从效率考虑:cookie > memcache > 数据库
cookie对服务器端负载没影响,如果加密、解密会多消耗一点点cpu。带宽倒是会消耗得多一点,同域名下的所有http request header都会附带cookie,所以在大流量下,把js、css、图片放到另外一个域名下会节约掉这部分流量。
memcache会占用一些服务器内存
数据库连接本来就是典型的瓶颈,能免则免

从安全性考虑:memcache/数据库 > cookie
cookie存放在客户端,需要考虑的安全性比较多一点
memcache、数据库都在服务器端,相对cookie来说会稍微安全点

从服务器可扩展性考虑:cookie > memcache/数据库
如果有多台后端服务器,就需要共享session数据
memcache、数据库都可以做到在多台服务器之间共享session,但是容易形成单点瓶颈,大负载下需要考虑存储路由之类
cookie完全不需要在服务器端共享session数据,与REST无状态风格暗合,REST无状态风格见下面。
可扩展性这个点也不是绝对,如果用nginx的ip_hash方式组织多个后端upstream就不需要共享session,但这些都需要后端架构上的考虑和设计,而cookie则完全没有这方面的扩展性问题
增补:cookie其实也不是在扩展性上没有任何问题需要考虑,说“完全没有”有点绝对了,可扩展性这种事情,复杂度比较高,需要实际问题实际分析。在比较简单理想的情况下,cookie的可扩展性会比较好点。

为什么在请求中传递SessionID被普遍认为是unRESTful的,而将用户的credentials包含在每个请求里又是一种非常RESTful的做法
无状态指的是任意一个Web请求必须完全与其他请求隔离,当请求端提出请求时,请求本身包含了相应端为相应这一请求所需的全部信息。
REST无状态风格
RESTful架构对于state的两个不同的解释: 应用状态(Application State)和资源状态(Resource State)。
应用状态:指的是与某一特定请求相关的状态信息
资源状态:则反映了某一存储在服务器端资源在某一时刻的特定状态,该状态不会因为用户请求而改变,任何用户在同一时刻对该资源的请求都会获得这一状态的表现(Representation)。
RESTful架构要求服务器端不保有任何与特定HTTP请求相关的资源,所以应用状态必须由请求方在请求过程中提供。
在Session ID可以被认为是一个用来标识某一会话状态的Key,将其传递给服务器端意味着这样一个请求:“请帮我取出这个状态信息”,也就是说这个请求假设响应方保有着状态信息。由于与某一特定请求相关的状态属于应用状态,而RESTful架构要求任何此类状态由请求方负责提供,所以传递Session ID被认为是unRESTful的做法。反过来,user credential作为一种应用状态,是被期望由请求方提供的,所以在请求中传递user credentials(姑且忽略安全性问题)是符合RESTful架构规范的

nginx的ip_hash方式:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的共享问题。

对于cookie保存验证码,仍旧不能杜绝机器的攻击,机器可以通过将通过种cookie的方式,然后在请求中发送对应的验证码来访问,这样服务的对验证码的判断,一直都是正确的。
可能有一种办法是验证码拼上时间戳的方式,再加密来种到cookie中,可是就算有了时间戳,也不能避免在你时间戳有效的范围内的攻击。

session的文件保存
session机制,在服务端session_start()之后,就会在响应头里面发送一个Set-Cookie字段,下次请求时,cookie中就会带上PHPSESSID,然后服务端根据PHPSESSID找到对应的保存session的文件。
所以涉及到session的有效期就分为客户端和服务器端。
客户端
session.cookie_lifetime=0时,关闭浏览器session就会失效
服务器端
session.gc_maxlifetime//session的有效期
session.gc_probability
session.gc_divisor
session.gc_divisor 与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。
此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。
当gc_probability/gc_divisor=1的时候意味着,每次请求来调用session_start()都会执行一次垃圾回收机制,将磁盘过期的session文件删除。亲试。
如果单独修改了gc_maxlifetime,即使session已经失效,但是如果没有触发垃圾回收机制,当请求再次过来时,session还是可以使用的。所以session做的登录,就可能会由于客户端保留了PHPSESSID导致过了几天再次访问还是登录状态

关于存session,cookie还是数据库或者memcache的优劣,部分网上抄录的更多相关文章

  1. 关于用户登录状态存session,cookie还是数据库或者memcache的优劣

    session中保存登陆状态: 优:整个应用可以从session中获取用户信息,并且查询时很方便.在session中保存用户信息是不可缺少的(web应用中) 缺:session中不宜保存大量信息,会增 ...

  2. 反向代理/负载均衡/session/cookie

    正向代理:客户端将流量重定向到burpsuite等软件或连接到VPN再访问服务器而不是直接访问服务器的场景.流量流动方向是真正机器--代理服务器.正向代理又称代理.普通代理. 反向代理:服务器端使用反 ...

  3. WEB, Flask - Session&Cookie

    参考: https://blog.csdn.net/nunchakushuang/article/details/74652877 http://portal.xiaoxiangzi.com/Prog ...

  4. Redis+Django(Session,Cookie)的用户系统

    一.Django authentication django authentication提供了一个便利的user api接口,无论在py中 request.user,参见Request and re ...

  5. 2.django笔记之缓存,session,cookie,ajax

    一.django缓存 1.缓存 缓存的意义在于把昂贵的计算结果保存起来一遍下次的访问,有缓存的站点的流程大概是这样子的: 给定一个url,检查页面是否在缓存中 如果在,返回缓存的页面 否则,生成该页面 ...

  6. PHP SESSION 保存到数据库

    PHP SESSION 的工作原理 在客户端(如浏览器)登录网站时,被访问的 PHP 页面可以使用 session_start() 打开 SESSION,这样就会产生客户端的唯一标识 SESSION ...

  7. session cookie原理及应用

    一.术语session在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的. session,中 ...

  8. POPTEST老李分享session,cookie的安全性以及区别 1

    POPTEST老李分享session,cookie的安全性以及区别   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程 ...

  9. 小技巧-ASP.Net session保存在数据库服务器

    引用博客:http://www.cnblogs.com/lykbk/archive/2013/01/13/hf576856868.html web Form 网页是基于HTTP的,它们没有状态, 这意 ...

随机推荐

  1. Windows下利用TortoiseSVN搭建本地SVN服务器

    写在前面: 安装TortoiseSVN时,图中这步要选择,才能同时安装后面需要的svnserve.exe 环境说明: Win 7 TortoiseSVN 1.7 搭建步骤: 0. 新建一个目录,做&q ...

  2. ubuntu MySQL拒绝远程连接(10061)

    MySQL是使用apt-get安装的 1.停止mysql服务 sudo service mysql stop 2.修改配置文件/etc/mysql/mysql.conf.d/mysqld.cnf 将b ...

  3. 享元(FlyWeight)模式

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式.享元模式尝试 ...

  4. Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素

    ylbtech-Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素 1.返回顶部 1. Java 实例 - 在数组中查找指定元素  Java 实例 以下实例 ...

  5. java多线程——监视锁(monitor)(转)

    https://blog.csdn.net/hqq2023623/article/details/51000153 java中每个对象都有唯一的一个monitor,想拥有一个对象的monitor的话有 ...

  6. Ring0创建事件Ring3设置事件

    同步事件(synchronizationEvent)当事件对象为激发时,如遇到KeWaitForXX等内核函数,事件对象则自动变回未激发态通知事件(NotificationEvent)当事件对象为激发 ...

  7. [UE4]Delay与Retriggerable Delay

    一.Delay 在右上角都有一个表盘的图标,表示不是在当帧内执行,而是需要一定时间才能完成的. 鼠标移上去,会有一段文字注释.根据指定的延迟时间执行一个延后的动作.当计时还没有结束的时候,如果再次被调 ...

  8. [UE4]蓝图替换节点、引用快捷方式

  9. [UE4]Size To content自动适配大小

  10. [UE4]蓝图使用GameMode重构

    GameMode的生命周期贯穿整个游戏,当然也包括各个关卡.因此可以把各个关卡都需要的功能放置在GameMode,以达到功能共享.重复利用的目的!