cookie和session的区别及使用

Cookie

    cookie 是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现 session 的一种方式
    cookie 实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用 response 向客 户端浏览器颁发一个 cookie。客户端浏览器会把 cookie 保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该 cookie 一同提交给服务 器。服务器检查该 cookie,以此来辨认用户状态。服务器还可以根据需要修改 cookie 的内容。
    cookie 失效的时间,单位秒。如果为正数,则该 cookie 在maxAge秒之后失效。如果为负数,该 cookie 为临时 cookie ,关闭浏览器即失效,浏览器也不会以任何形式保存该 cookie 。如果为 0,表示删除该 cookie 。默认为 –1。

  • cookie 具有不可跨域名性,当前网站不能操作另一个网站的 cookie
  • cookie 不提供修改、删除操作

应用场景

    1. 永久登录

    如果用户是在自己家的电脑上上网,登录时就可以记住他的登录信息,下次访问时不需要再次登录,直接访问即可。实现方法是把登录信息如账号、密码等保存在 cookie 中,并控制 cookie 的有效期,下次访问时再验证 cookie 中的登录信息即可。
    保存登录信息有多种方案。最直接的是把用户名与密码都保持到 cookie 中,下次访问时检查 cookie 中的用户名与密码,与数据库比较。这是一种比较危险的选择,一般不把密码等重要信息保存到 cookie 中。

在 Node.js 服务器中使用 Cookie

  1. 使用 npm 下载 cookie 插件
npm install cookie-parser --save
  1. 在 app.js 文件里引入cookie 插件
var express = require('express')
var cookieParser = require('cookie-parser')
var app = express()

app.use(logger('dev'))
app.use(express.json())
app.use(express.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(cookieParser())
app.use(express.static(path.join(__dirname, 'public')))
  1. 在 routes 目录下的 index.js 里使用
var express = require('express')
var router = express.Router()

// 登录
router.get('/login', function(req, res, next) {
	res.cookie('userId', '123456', {
	    path: '/',
	    maxAge: 1000*60*60*24
	})
})

// 退出登录
router.get('/logout', function(req, res, next) {
	res.cookie('userId', '', {
      path: '/',
      maxAge: -1
  })
})

module.exports = router

Cookie 的属性

属性描述
String name该 cookie 的名称。cookie 一旦创建,名称便不可更改
Object value该 cookie 的值。如果值为 Unicode 字符,需要为字符编码。如果值为二进制数据,则需要使用 BASE64 编码
int maxAge该 cookie 失效的时间,单位秒。如果为正数,则该 cookie 在 maxAge 秒之后失效。如果为负数,该 cookie 为临时 cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该 cookie。如果为 0,表示删除该 cookie。默认为 –1
Boolean secure该 cookie 是否仅被使用安全协议传输。安全协议。安全协议有 HTTPS,SSL 等,在网络上传输数据之前先将数据加密。默认为 false
String path该 cookie 的使用路径。如果设置为 “/ sessionWeb /”,则只有 contextPath 为 “ /sessionWeb /” 的程序可以访问该 cookie。如果设置为 “ / ”,则本域名下 contextPath 都可以访问该 cookie。注意最后一个字符必须为 “ / ”
String domain可以访问该 cookie 的域名。如果设置为 “ .google.com ”,则所有以 “ .google.com ”结尾的域名都可以访问该 cookie。注意第一个字符必须为 “ . ”
String comment该 cookie 的用处说明。浏览器显示 cookie 信息的时候显示该说明
int version该 cookie 使用的版本号。0 表示遵循 Netscape 的 cookie 规范,1 表示遵循 W3C 的 RFC 2109 规范

Session

    HTTP 协议是无状态的,session 不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为 session 的 cookie,它的值为该 session 的 id。session 依据该 cookie 来识别是否为同一用户。

  • session 默认被存在在服务器的一个文件里(不是内存)
  • session 是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中
  • session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)

应用场景

    1. 通过 session 累计用户数据

    例如,一个未登录用户访问了京东网站,这个时候京东对其下发了一个 cookie,假设cookie的名字叫做abc,那这条记录就是 abc=001,同时京东的后台也生成了一个 session id, 它的值也为 001, 001 这个客户在 2 点、 3 点、 4 点分别添加了三件商品到购物车,这样后台也记录了 session id 为 001的用户的购物车里面已经有三件商品,并且只要每次客户端 cookie 带上来的值里面包含session id,后台都能够展示相应的数据,如果这个时候,在浏览器里面清空 cookie,cookie 数据消失之后,后台和客户端无法建立对应关系,购物车的数据就会失效了。

    2. 通过 session 实现单点登录

    一个用户帐号成功登录后,在该次 session 还未失效之前,不能在其他机器上登录同一个帐号。登录后将用户信息保存到 session 中,如果此时在另外一台机器上一个相同的帐号请求登录,通过遍历(遍历的意思就是将所有 session 都查看一遍)Web服务器中所有 session 并判断其中是否包含同样的用户信息,如果有,在另一台机器上是不能登录该帐号的。

在 Node.js 服务器中使用 session

  1. 使用 npm 下载 express-session 插件
npm install express-session --save
  1. 在 app.js 文件里引入 express-session 插件
var express = require('express')
var cookieParser = require('express-session')

var app = express()

app.use(logger('dev'))
app.use(express.json())
app.use(express.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(express.static(path.join(__dirname, 'public')))

// 使用 session 中间件
app.use(session({
  secret :  'secret', // 对 session id 相关的 cookie 进行签名
  resave : true,
  saveUninitialized: false, // 是否保存未初始化的会话
  cookie : {
    maxAge : 1000 * 60 * 3, // 设置 session 的有效时间,单位毫秒
  }
}))
  1. 在 routes 目录下的 index.js 里使用
var express = require('express')
var router = express.Router()

// 首页
router.get('/', function(req, res, next) {
	// 检查有没有 session
	if(req.session.user) {
		res.json({
			status: 0,
			msg: 'success'
		})
	} else {
		// 没有 session 重定向登录页
		res.redirect('/login')
	}
})

// 登录
router.get('/login', function(req, res, next) {
	var user = {
		userId: '123456',
		userName: 'xiaoli'
	}
	req.session.user = user
	res.json({
		status: 0,
		msg: 'success'
	})
})

module.exports = router

express-session 插件的参数

参数描述
name设置 cookie 中,保存 session 的字段名称,默认为 connect.sid
storesession 的存储方式,默认存放在内存中,也可以使用 redis,mongodb 等。express 生态中都有相应模块的支持
secret通过设置的 secret 字符串,来计算 hash 值并放在 cookie 中,使产生的 signedCookie 防篡改
cookie设置存放 session id 的 cookie 的相关选项,默认为 (default: { path: ‘/’, httpOnly: true, secure: false, maxAge: null })
genid产生一个新的 session_id 时,所使用的函数, 默认使用 uid2 这个 npm 包
rolling每个请求都重新设置一个 cookie,默认为 false
resave即使 session 没有被修改,也保存 session 值,默认为 true

Cookie 和 Session 的区别

  1. cookie 数据存放在客户的浏览器上,session 数据放在服务器上
  2. cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session
  3. session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie
  4. 单个 cookie 保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个 cookie,session 没有大小限制
  5. cookie 中保存的是字符串,session 中保存的是对象
  6. session 不能区分路径,同一个用户在访问一个网站期间,所有的 session 在任何一个地方都可以访问到,而 cookie 中如果设置了路径参数,那么同一个网站中不同路径下的 cookie 互相是访问不到的
  7. cookie 通过在客户端记录信息确定用户身份,session 通过在服务器端记录信息确定用户身份
  8. cookie 是通过服务器在浏览器中设置的一个标识,而 session 是存储在服务器里面的一个标识
  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半度℃温热

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值