Cookie and Session in Node.js and PHP
做一个关于小甜饼的笔记
Cookie
“小甜饼”。类型为“小型文本文件”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。
无状态协议,是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP协议是无状态的,Cookie 就是用来绕开 HTTP 的无状态性的“额外手段”之一。服务器可以设置或读取 Cookies 中包含的信息,借此维护用户跟服务器会话中的状态。
- Cookie 会被附加在每个 HTTP 请求中,所以无形中增加了流量。
- 由于 HTTP 请求中的 Cookie 是明文传递的,所以安全性成问题,除非使用超文本传输安全协定。
- 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。