草庐IT

cookie、session、web storage

欲速则不达 2023-03-28 原文

cookie与session的区别

首先,使用cookie和session的目的都是为了跟踪记录用户状态,因为http协议是无状态的协议,而某些场景服务端需要记录用户的状态,如购物车,需要来识别具体的用户,服务端就为特定的用户创建特定的session,用于标识并跟踪用户;

其次,cookie和session都是会话技术,session保存在服务端,cookie保存在客户端,服务端无法知道请求对应哪个session,依靠cookie来实现session的跟踪。

所以在跟踪用户方面,cookie与session属于互相配合的关系。浏览器第一次访问服务器会创建一个session对象,通过cookie返回到浏览器(服务端会在响应头里面添加一个Set-Cookie选项,浏览器收到这类响应后通常会保存下Cookie,用于标识用户)。

在使用限制方面,cookie可以在有效期内(setMaxAge()设置有效期或者默认关闭浏览器后就失效)保存信息,但是有大小限制(约5kB)以及浏览器对cookie的存储有个数限制(每个域名可能30、50个),如果个数过多,会使header大小超过服务器的处理限制;而session本身没有大小限制,但是和服务器的内存大小有关,session保存在服务端上存在一段时间才会消失,所以session过多会增加服务器的压力。

在安全方面,cookie有安全隐患,通过拦截得到cookie后可以进行攻击。

session可以认为是一个抽象概念,开发者为了实现中断和继续等操作,将user agent和server之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是session的概念。而cookie是一个实际存在的东西,http协议中定义在header中的字段,可以认为是session的一种后端无状态实现。

在使用方面,cookie除了可以跟踪会话,也可以保存用户喜好或者保存用户名密码等等,所以可以说cookie的用途更广泛。

cookie和localStorage的区别

第一,两者使用的出发目的不同,cookie最早是为了跟踪记录用户状态,用于客户端和服务端的信息传递,而localStorage的使用目的是为了在客户端存储一些简单的数据。

第二,两者的大小限制不同,cookie的限制比较小,大约是5kB,超过单个域名限制后,再设置cookie,浏览器会清除以前设置的cookie,而localStorage存储的大小就相对较大,业界主流是5MB。

第三,两者的存储期限不同,localStorage理论上来说永久有效,即不主动清空的话就不会消失,但移动设备的浏览器或者WebView中,可能会因为各种原因(退出app、网络切换、内存不足等原因)被清空;cookie就比较灵活,可以设置失效日期expires(GMT格式的时间),如果没有设置expires,这样的cookie称为会话cookie,它存在内存中,当会话结束,也就是浏览器关闭时,该cookie就消失。

第四,网络传输方面,每次HTTP请求,会自动将同域名的cookie添加到request header的cookie字段发送至服务器,但是可以设置Secure选项使cookie只在确保安全的请求中发送,所以如果cookie内容太多,会增加网络开销;localStorage的内容则不会被带上。

第五,浏览器支持情况方面,IE7及以下版本不支持web storage,cookie兼容性比较好。

第六,在操作方面,localStorage提供现有的API去访问操作,cookie需要自己来封装或者使用第三方库;但是cookie既可以由服务端来设置,也可以由客户端来设置,localStorage只能是客户端来设置。

另外,因为cookie比较灵活,还可以设置domain、path、httpOnly,domain和path一起来限制cookie能被哪些URL访问,即请求的URL是Domain或其子域、且URL的路径是Path或子路径,则可以访问该cookie;如果某个cookie设置了httpOnly,客户端就无法通过js代码去访问这个cookie。

总体来说,cookie用途多一些,也更灵活,但存储体积小,localStorage可以存储较多内容。

cookie的优缺点

  • 缺点
    • 每个域名下的cookie个数有限
    • 存储量太小,只有5kB
    • 每次HTTP请求都会发送到服务器,影响获取资源的效率
    • 需要自己封装获取、设置、删除cookie的方法
  • 优点
    • 比较灵活
    • 用途多

sessionStorage与localStorage

sessionStorage用于本地存储一个会话中的数据,这些数据只有在同一个会话中的页面才能访问,并且当会话结束后,数据也随之销毁,所以sessionStorage仅仅是会话级别的存储,而不是一种持久化的本地存储。

localStorage是持久化的本地存储,除非是通过JS删除,或者手动清除缓存,否则理论上数据不会过期。

使用场景区别

cookie由于体积小,并不适合专门用于存储用途,主要还是适用于会话凭证。

localStorage和sessionStorage因为体积较大(业界主流为5MB),又主要以字符串的形式存储,更适合用于存储客户端的简单数据。

sessionStorage的数据由于在会话结束后就会被销毁,更适合对安全性要求较高的场景;也适用于存储一些与当前会话关联性较强的数据,比如记录跳转的路由信息,在别的会话窗口就不适用,就可以存储在sessionStorage中。

如果有更多大量复杂结构的数据需要存取访问,可以考虑使用indexDB,但需要考虑indexDB的兼容性。

有关cookie、session、web storage的更多相关文章

  1. ruby-on-rails - Rails 优雅地处理超时 session ? - 2

    使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p

  2. ruby-on-rails - Rails Cookie 问题 - 2

    我在ruby​​onrails应用程序中有以下新方法:defnewifcookies[:owner].empty?cookies[:owner]=SecureRandom.hexend@movie=Movie.new@movie.owner=cookies[:owner]end基本上,每个新用户都应该获得一个代码来识别他们(尽管只是通过cookie)。因此,当用户创建电影时,创建的cookie将存储在owner字段中。所以有两个问题:使用.empty?方法,当我从浏览器中删除cookie时,返回一个undefinedmethodempty?'对于nil:NilClass`当我确实已经在

  3. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  4. ruby - Controller 中的 request.cookies 和 cookies 有什么区别? - 2

    request.cookies和RubyonRails中的cookies对象有区别吗?我目前正在尝试将带有cookie的请求从我的node.js服务器发送到我的ROR4应用程序。似乎在ROR应用程序中,request.cookies包含我发送的cookie,但是cookies对象(现有逻辑所基于的对象)没有它。我已经搜索了文档,但找不到任何相关内容。我错过了什么吗?感谢您的帮助。 最佳答案 理想情况下,request.cookies和cookies应该相同。但是,在POST(创建操作)请求中,rails会验证XSRFtoken。如果

  5. ruby - 如何打印出 Mechanized 存储的 cookie? - 2

    我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject

  6. ruby - Sinatra session 未按预期持续 - 2

    我正在尝试使用Sinatra中的重定向和session在网站周围传递一些数据。这是一个简化的示例,使用PrettyPrint进行调试:require'pp'require'rubygems'require'sinatra'enable:sessionsget'/'dosession[:foo]='12345'puts'session1'ppsessionredirectto('/redir')endget'/redir'doputs'session2'ppsession'helloworld'end查看Thin的输出,我看到:>>Listeningon0.0.0.0:4567,CTRL

  7. ruby-on-rails - 自定义设计 Cookie - 2

    我在我的Rails应用程序中使用设计。我在租户庄园中配置了它,其中帐户/session的范围限定为子域。例如:http://subdomain1.example.com/http://subdomain2.example.com/...这很好用,但我想为“super管理员”添加一个子域,允许这些用户导航到所有其他子域而无需重新验证。这将是这样的:http://admin.example.com/是否可以自定义仅在管理子域上生成的cookie,以便它在所有其他子域上都有效? 最佳答案 Cookie域的定义越不具体,它们的包容性就越大,

  8. ruby - 如何强制 Rack :session + sinatra to read "rack.session" from params instead of cookies - 2

    我正在处理oauth1.0(twitter和flickr)。网站工作在80端口,oauth服务器工作在8080端口算法:向oauth服务器发送ajax请求以检查用户是否有有效的access_token如果用户没有access_token或access_token已过期,则打开授权窗口在oauth服务器的用户session中保存access_token发送分享数据到oauth服务器它使用sinatra+rack:session+rack::session::sequel+sqlite来存储session。它在每个响应中发送Set-Cookie:rack.session=id我正在使用2种

  9. ruby-on-rails - 如何编写 Rails 4 测试以使用 omniauth-google-oauth2 gem 创建 session ? - 2

    我正在尝试为使用omniauth-google-oauth2gem创建session编写测试。我是否需要将env["omniauth.auth"]变量与post:create一起传递?也许当我试图这样做时,我做错了。我得到的错误如下所示...Rake测试错误1)Error:SessionsControllerTest#test_should_get_create:NoMethodError:undefinedmethod`provider'fornil:NilClassapp/models/user.rb:6:in`from_omniauth'app/controllers/sessi

  10. ruby - session 未创建 : Chrome version must be between - 2

    当使用ruby​​selenium驱动程序驱动chrome时,我得到/home/travis/.rvm/gems/ruby-2.6.2/gems/selenium-webdriver-3.141.5926/lib/selenium/webdriver/remote/response.rb:72:in`assert_ok':sessionnot创建:Chrome版本必须在70和73之间(Selenium::WebDriver::Error::SessionNotCreatedError)如何解决这个问题?降级chrome不是我想做的事。 最佳答案

随机推荐