笔记 - Node.js , PHP 操作 Cookie , Session

411 阅读2分钟

Cookie and Session in Node.js and PHP

做一个关于小甜饼的笔记

Cookie

“小甜饼”。类型为“小型文本文件”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。

无状态协议,是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HTTP协议是无状态的,Cookie 就是用来绕开 HTTP 的无状态性的“额外手段”之一。服务器可以设置或读取 Cookies 中包含的信息,借此维护用户跟服务器会话中的状态。

  1. Cookie 会被附加在每个 HTTP 请求中,所以无形中增加了流量。
  2. 由于 HTTP 请求中的 Cookie 是明文传递的,所以安全性成问题,除非使用超文本传输安全协定。
  3. Cookie 的大小限制在 4 KB 左右,对于复杂的存储需求来说是不够用的。

如何烤制一个Cookie

如上文所说,Cookie会被附在每个Http请求中,我们能在每个http header里面找到它。

Cookie由Server通过Set-Cookie设置并投放给Client。 (前端虽然可以但是最好不要设置cookie)

其存在形式如下:

Cookie: <cookie-list>
Cookie: name=value
Cookie: name=value; name2=value2; name3=value3

Session出现后,cookie也被用于储存Session ID方便Server快速查找用户数据。

JavaScript如何查看Cookie

document.cookie

实际上通过修改 document.cookie就可以从前端修改cookie的值,最好不要这么做。 通过后端 Set-Cookie 添加 HttpOnly 可使 document.cookie查询失效,从而无法修改Cookie。

Node.js原生设置Cookie

假设我们需要在Cookie中储存Session ID,只需要在response header中定义Set-Cookie即可

response.setHeader("Set-Cookie", `session_id=${random}; HttpOnly`);

PHP设置Cookie

php setcookie()接受三个参数,name, value, expired time(过期时间)

<?php
setcookie("<name>", "<value>", time()+3600);
?>

PHP读取Cookie

php 中存在 超全局变量 $_COOKIE,直接从中获取cookie的值即可

<?php
$_COOKIE["user"];
?>

Session

session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而session保存在服务器上。

用户每次登录,都会生成一个Session ID储存在数据库中,根据需要服务器可能会销毁Session。

PHP中的Session

同Cookie一样,PHP中的Session也是一个超全局变量。

使用Session

在使用session之前,必须使用session_start() 函数启动会话。

<?php
  session_start();
  // store session data
  $_SESSION['views']=1;
?>

终结 Session

如果要删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数。

可以使用unset()函数释放指定的session变量:

<?php
  unset($_SESSION['views']);
?>

也可以通过 session_destroy() 函数彻底终结 session,这时所有的session数据都会消失

session_destroy()往往用于用户登出。

<?php
  session_destroy();
?>

代替Session和Cookie的JSON Web Token(JWT)

Nodejs中似乎没有单独提供给Session和Cookie的部分,但是目前有了可以替代二者结合用法的JWT。

可参考:www.ruanyifeng.com/blog/2018/0…