为什么需要cookie
我们知道http是无状态的协议,无状态是什么意思呢?
我来举一个小例子来说明:比如小明在网上购物,他浏览了多个页面,购买了一些物品,这些请求在多次连接中完成,如果不借助额外的手段,那么服务器是不知道他到底购买了什么的,因为服务器压根就不知道每次请求的到底是不是小明,除非小明有一个标识来证明他是小明。
所以,网站为了辨别用户身份,进行 session 跟踪,cookie出现了。
cookie是什么
简单来说,cookie就是标识。
严格来说,cookie是一些存储在客户端的信息,每次连接的时候由浏览器向服务器递交,服务器也向浏览器发起存储 Cookie 的请求,依靠这样的手段,服务器可以识别客户端。
具体来说,浏览器首次向服务器发起请求时,服务器会生成一个唯一标识符并发送给客户端浏览器,浏览器将这个唯一标识符存储在 Cookie 中,之后每次发起的请求中,客户端浏览器都会向服务器传送这个唯一标识符,服务器通过这个唯一标识符来识别用户。
说了这么多,打开浏览器,我们先来看看这货吧。
上图中,就是浏览器中存的一个cookie,他的名字叫name,值为abc。
常规cookie
光看不过瘾,接下来,用node动手来做一个常规cookie吧。
首先,安装express框架和cookieParser中间件
npm i express --save npm install cookie-parser --save
cookieParser中间件的主要用途如下:
代码如下:
var express = require('express'); var cookieParser = require('cookie-parser'); var app = express(); app.use(cookieParser()); app.use(function (req, res) { if (req.url === '/favicon.ico') { return } // 设置常规cookie, 有效期为20s, 客户端脚本不能访问它的值 res.cookie('name', 'abc', { signed: false, maxAge: 20 * 1000, httpOnly: true }); console.log(req.cookies, req.url, req.signedCookies); res.end('hello cookie'); }) app.listen(4000)
运行后,在浏览器中打开 http://localhost:4000/
以chrome为例,f12打开浏览器调试工具,在application中的cookies中便能发现你定义的cookie。
req.cookies和req.signedCookies属性是随http请求发送过来的请求头中的Cookie的解析结果。
其中,req.cookies对应的是普通cookie,req.signedCookies对应的是签名cookie。
如果请求中没有cookie,这两个对象都是空的。
签名cookie
签名cookie更适合敏感数据,因为用它可以验证cookie数据的完整性,有助于防止中间人攻击。
有效的签名cookie放在req.signedCookies对象中。
代码如下:
var express = require('express'); var cookieParser = require('cookie-parser'); var app = express(); // 设置密钥,用来对cookie签名和解签, Express可以由此确定cookie的内容是否被篡改过 app.use(cookieParser('a cool secret')); app.use(function (req, res) { if (req.url === '/favicon.ico') { return } // 设置签名cookie, 并且有效期为1min res.cookie('name', 'efg', { signed: true, maxAge: 60 * 1000, httpOnly: true }); console.log(req.cookies, req.url, req.signedCookies); res.end('signed cookie'); }) app.listen(4000)
运行后,在浏览器中打开 http://localhost:4000/
以chrome为例,f12打开浏览器调试工具,在application中的cookies中便能发现你定义的签名cookie,格式如下:s%3Aefg.7FJDuO2E9LMyby6%2Bo1fGQ3wkIHGB9v1CDVWod8NQVAo
.号左边是cookie的值,右边是服务器上用SHA-1 HMAC生成的加密哈希值。
如果这个签名cookie的值被篡改,那么服务器上对cookie的解签会失败,在node中输出的req.signedCookies将为false。如下:
而如果cookie完好无损地传上来,那么将会被正确解析:
总结
你可以在cookie中存放任意类型的文本数据,但通常是在客户端存放一个会话cookie,这样你就能在服务器端保留完整的用户状态。
session
session和基于cookie的。 存在于服务器,相对cookie安全,但session也存在session劫持的风险, 所以需要一串很长很多的秘钥数组来增加破解的难度。同时设置manAge过期时间, 减少留给坏人破解时间。
node中有的中间件 是cookie-session
const express = require('express'); const cookieParser = require('cookie-parser'); const cookieSession = require('cookie-session'); var app = express(); app.use(cookieParser()); //cookieSession 必须放在cookieParser后面 app.use(cookieSession({ //session的秘钥,防止session劫持。 这个秘钥会被循环使用,秘钥越长,数量越多,破解难度越高。 keys: ['aaa', 'bbb', 'ccc'], //session过期时间,不易太长。php默认20分钟 maxAge: 60*60, //可以改变浏览器cookie的名字 name: 'session' })); app.use('/', function (req, res) { //假设使用count记录用户访问的次数 if(req.session['count'] == null) { req.session['count'] = 1; }else{ req.session['count']++; } console.log(req.session['count']) res.send('ok') }) app.listen(8080) //删除 delete req.session
浏览器中可以看到,服务器通过respond的set-cookie返回cookie
session是返回的cookie ID, session.sig 是session签名,作用是知道session是否被修改过
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Django组件cookie与session的具体使用,包括了Django组件cookie与session的具体使用的使用技巧和注意事项,需要的朋友参考一下 一、会话跟踪技术 1、什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话,你就是客户端,而10086服务人员就是服
问题内容: 我有一个nodejs应用程序,它可以处理用户的请求并接收我要代理到内部API服务的cookie。如何通过使用节点获取来解决这个问题? 请不要提供超级代理。 问题答案: 您应该能够通过在请求的标头中设置cookie来传递cookie:
问题内容: 在我的应用程序中,我需要使用express框架设置cookie。我已经尝试了以下代码,但没有设置cookie。 谁能帮我做到这一点? 问题答案: 在Express中使用中间件的顺序很重要:先前声明的中间件将首先被调用,并且如果它可以处理请求,则稍后声明的任何中间件都不会被调用。 如果正在处理请求,则需要向上移动中间件: 此外,中间件需求 要么 端的请求(通过发回的响应),或请求传递到下
本文向大家介绍angular.extend方法的具体使用,包括了angular.extend方法的具体使用的使用技巧和注意事项,需要的朋友参考一下 AngularJs的angular.extend()方法可以把一个或多个对象中的方法和属性扩展到一个目的对象中,使得这个对象拥有其他对象相同的方法和属性,如下图所示。 angular.extends()方法的第一个参数是要被扩展的对象,后面可以传入一个
本文向大家介绍C++11中std::future的具体使用方法,包括了C++11中std::future的具体使用方法的使用技巧和注意事项,需要的朋友参考一下 C++11中的std::future是一个模板类。std::future提供了一种用于访问异步操作结果的机制。std::future所引用的共享状态不能与任何其它异步返回的对象共享(与std::shared_future相反)( std::
本文向大家介绍Android中Permission权限机制的具体使用,包括了Android中Permission权限机制的具体使用的使用技巧和注意事项,需要的朋友参考一下 由上篇Android Permission权限机制引子,我们知道Android 通过在每台设备上实施了基于权限的安全策略来处理安全问题,采用权限来限制安装应用程序的能力。本篇文章继续来探讨和Android权限相关的话题,主要集中