이 글에서는nodejs의 쿠키와 세션을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
관련 추천: "nodejs Tutorial"
저는 프레임워크에서 플러그인을 사용하는 데 익숙합니다. 최근에 node의 기본 모듈을 검토할 때 궁금하지 않을 수 없었습니다. 쿠키? 세션이란 무엇입니까? 둘 사이의 차이점과 연관성은 무엇입니까? Node.js는 스토리지 세션을 관리하기 위해 해당 모듈을 제공합니까? 해당 모듈이 제공되지 않으면 세션 관리
과 유사한 모듈을 어떻게 구현해야 합니까? 세션과 쿠키는 모두 웹 서버를 기반으로 하는 반면, 세션은 쿠키가 클라이언트에 저장된다는 점입니다. 서버 끝에 저장됩니다.
사용자가 웹사이트를 탐색하면 웹 서버는 현재 사용자에 대한 일부 정보를 브라우저에 저장하며, 로컬 웹 클라이언트에 저장되는 것은 쿠키 데이터입니다. 이런 방식으로, 다음에 사용자가 동일한 웹 사이트를 탐색할 때 웹 서버는 먼저 로컬 쿠키 정보를 확인하고 읽습니다. 쿠키가 있는 경우 쿠키의 내용을 기반으로 만료 시간을 결정하여 특별한 쿠키를 반환합니다. 사용자에게 데이터를 제공합니다.
쿠키 사용은 매우 일반적입니다. 개인화된 서비스를 지원하는 많은 웹사이트는 웹 인터페이스의 무료 이메일과 같이 사용자에게 맞춤화된 콘텐츠 전달을 용이하게 하기 위해 주로 쿠키를 사용하여 사용자를 식별합니다. 또 다른 예: 대부분의 웹사이트에서 지원되는 '7일 로그인 불가'입니다.
구체적으로 쿠키 메커니즘은 클라이언트 측에서 상태를 유지하는 솔루션을 사용하는 반면, 세션 메커니즘은 서버 측에서 상태를 유지하는 솔루션을 사용합니다. 동시에, 서버 측 상태 유지 솔루션도 클라이언트 측의 ID를 저장해야 하므로 세션 메커니즘은 ID 저장 목적을 달성하기 위해 쿠키 메커니즘을 사용해야 할 수도 있음을 알 수 있습니다. 그러나 실제로는 다른 옵션이 있습니다. 정통 쿠키 배포는 HTTP 프로토콜을 확장하여 수행됩니다. 서버는 지침에 따라 해당 쿠키를 생성하도록 브라우저에 메시지를 표시하기 위해 http 응답 헤더에 특수 식별 라인을 추가합니다. 그러나 JavaScript 또는 VBScript와 같은 순수 클라이언트 측 스크립트도 쿠키를 생성할 수 있습니다(document.cookie='xxx=xxx;expires=xxx'
).document.cookie='xxx=xxx; expires=xxx'
。
cookie是基于session的
cookie的使用却是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则可把该cookie附在去请求资源的http请求头上发送给服务器。
Cookie的内容主要包括:名字、值、过期时间、路径和域。路径与域一起构成Cookie的作用范围。若不设置过期时间,则表示这个Cookie的生命期为浏览器会话期间,关闭浏览器窗口,Cookie 就消失。这种生命期为浏览器会话期的Cookie,被称为会话Cookie。会话Cookie一般不存储在硬盘上,而是保存在内存里,当然这种行为并不是规范的。若设置了过期时间,浏览器就会把Cookie保存到硬盘上,关闭后再次打开浏览器,这些Cookie仍然有效,直到超过设定的过期时间。
而对于保存在内存里的Cookie, 不同的浏览器有不同的处理方式。Session机制是一种服务器端的机制,服务器使用类似于散列表的结构(也可能真的使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个 Session 时,服务器首先检查这个客户端的请求里是否已包含了一个Session标识(称为Session id),如果已包含则说明以前已经为此客户端创建过Session,服务器就按照Session id把这个Session检索出来使用(检索不到,会新建一个), 如果客户端请求不包含Session id,则为此客户端创建一个Session并且生成-一个与此Session相关联的Session id, Session id的值应该是一个既不会重复,又不容易被发现其生成规律的字符串,这个Session id将在本次响应中被返回给客户端保存。保存这个Session id的方式可以采用Cookie,这样在交互过程中浏览器可以自动按照规则把这个标识发送给服务器。一般这个Cookie的名字都类似于SESSID。
既然session如此“重要”,我们不妨来看看session模块:
PHP中内置了session方法可供调用,例如session_start
以及$_SESSION
쿠키는 세션 기반입니다.쿠키 사용은 특정 원칙에 따라 브라우저에 의해 백그라운드에서 서버로 자동 전송됩니다. 브라우저는 저장된 모든 쿠키를 확인하며, 선언된 쿠키의 범위가 요청하려는 리소스의 위치보다 크거나 같으면 해당 쿠키를 HTTP 요청 헤더에 첨부하여 리소스를 요청하고 서버로 보낼 수 있습니다. 쿠키 콘텐츠에는 주로 이름, 값, 만료 시간, 경로 및 도메인이 포함됩니다. 경로와 도메인이 함께 쿠키의 범위를 형성합니다. 만료 시간이 설정되지 않으면 이 쿠키의 수명은 브라우저 세션 동안이라는 의미이며, 브라우저 창이 닫히면 쿠키가 사라집니다. 수명이 브라우저 세션인 이러한 유형의 쿠키를 세션 쿠키라고 합니다. 세션 쿠키는 일반적으로 하드 디스크에 저장되지 않지만 메모리에 저장됩니다. 물론 이 동작은 표준화되어 있지 않습니다. 만료 시간이 설정되면 브라우저는 쿠키를 하드 디스크에 저장합니다. 브라우저를 닫았다가 다시 열면 해당 쿠키는 설정된 만료 시간이 초과될 때까지 계속 유효합니다. 브라우저마다 메모리에 저장된 쿠키를 처리하는 방법이 다릅니다. 세션 메커니즘은 서버측 메커니즘으로, 서버는 정보를 저장하기 위해 해시 테이블과 유사한 구조를 사용합니다(또는 실제로 해시 테이블을 사용할 수도 있음). 프로그램이 클라이언트 요청에 대한 세션을 생성해야 하는 경우 서버는 먼저 클라이언트의 요청에 세션 식별자(세션 ID라고 함)가 포함되어 있는지 확인합니다. 만약 그렇다면 이는 이전에 이 클라이언트에 대해 세션이 생성되었음을 의미합니다. 서버는 세션 ID에 따라 세션을 검색하고 이를 사용합니다(검색할 수 없는 경우 새 세션을 생성합니다). 클라이언트 요청에 세션 ID가 포함되어 있지 않으면 클라이언트에 대한 세션이 생성되고 관련 세션이 생성됩니다. 이 세션 ID가 생성되면 세션 ID 값은 반복되지도 않고 생성 규칙을 쉽게 찾을 수 없는 문자열이어야 합니다. 이 세션 ID는 이 응답에 저장하기 위해 클라이언트에 반환됩니다. 쿠키는 이 세션 ID를 저장하는 데 사용될 수 있으므로 상호 작용 중에 브라우저는 규칙에 따라 이 식별 정보를 서버에 자동으로 보낼 수 있습니다. 일반적으로 이 쿠키의 이름은 SESSID와 유사합니다. 세션 모듈 구현세션은 매우 "중요"하므로 세션 모듈을 살펴보는 것이 좋습니다. PHP에는
session_start
와 같은 호출용 세션 메서드가 내장되어 있습니다. > 및
$ _SESSION
등. 그러나 기본 Node.js는 세션 관리 모듈을 제공하지 않으므로 직접 구현할 수 있습니다.
위의 세션 및 쿠키 소개를 바탕으로 로직을 파악하는 것은 어렵지 않습니다
(실제로 서버는 해당 세션이 브라우저의 쿠키에 해당 세션 ID가 있는지 확인합니다.)
그림과 같이 위 그림에서 클라이언트는 먼저 세션을 요청하고 서버가 클라이언트의 쿠키에 해당 세션 ID가 없는지 확인할 때 특정 방식으로 새 세션 ID를 생성합니다. 세션 ID가 존재하는 경우 쿠키에 있고 만료되지 않은 경우 세션 데이터가 직접 반환됩니다.
그런 다음 위의 프로세스 다이어그램과 소개에 따라 먼저 구현해야 하는 모듈, 즉 start, newSession 및 cleanSessions에 대한 3가지 메서드를 만들 수 있습니다. start 메소드는 주로 세션 관리를 시작하고 newSession은 주로 클라이언트에 대한 새 세션 ID를 생성하며 cleanSessions는 세션 데이터를 지웁니다.
이 모듈은 세션 배열을 사용하여 시스템의 모든 세션을 저장합니다. 세션 ID가 있으면 새 세션 ID를 만들 필요가 없지만 세션 ID가 없으면 세션 데이터를 직접 읽고 반환합니다. 세션 ID를 생성해야 하며 세션 ID는 클라이언트 쿠키에 저장됩니다. 작성자는 간단한 세션 확인 시작을 만들었습니다. 코드는 다음과 같습니다.
var start = function(req,res){ var conn = { res: res, req: req }; var cookies = {}; if(typeof conn.req.headers.cookie !== "undefined"){ //session存在时,对session进行解析,获取其中的session id conn.req.headers.cookie.split(';').forEach(function(cookie){ var parts=cookie.split('='); cookies[ parts[0].trim() ] = (parts[1] || '').trim(); }); }else{ cookies.SESSID = 0; } var SESSID = cookies.SESSID; if(typeof sessions[SESSID] !== "undefined"){ //判断服务器中是否存在该session值 session=sessions[SESSID]; if(session.expires위는 간단한 세션 확인 프로세스입니다. 주요 아이디어는 req 개체의 헤더를 통해 쿠키를 얻고, 쿠키를 구문 분석하여 세션을 얻는 것입니다. id를 확인한 다음 id 값이 존재하는지 확인하여 새 세션을 반환하거나 생성합니다. newSession의 기본 메소드 구현을 살펴보겠습니다.
function newSession(res){ var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; var SESSID = ''; for(var i = 0; i물론 마지막 단계는 전체 모듈을 노출하는 것입니다.
exports.start=start;로그인 후 복사
세션 모듈의 적용
항목 파일에서 이를 요구할 수 있습니다. (예: app.js) 모듈을 만들고, HTTP의 createServer 함수에서 session.start를 호출하고, session.start에서 반환된 개체를 전역 개체로 저장합니다. 코드는 다음과 같습니다.
var app=http.createServer(function(req,res){ global.sessionLib = session.start(res,req); }); //调用时 if(!sessionLib['username']){ sessionLib['username'] = 'mxc'; }
기본 모듈을 소개한 후 작성자의 프로젝트 중 하나를 선택하여 프레임워크에서 관련 플러그인의 기본 사용법을 설명하세요. 실제로 구현 원리는 여기에 언급된 것과 정확히 동일합니다. 기사.
const cookieSession=require('cookie-session');
(function (){ var keys=[]; for(var i=0;i사용 시 판단:
//检查登录状态 router.use((req, res, next)=>{ if(!req.session['admin_id'] && req.url!='/login'){ //没有登录且当前不是登录页(避免redirect黑洞) res.redirect('/admin/login'); }else{ next(); } });로그인 후 복사
로그인 후:
req.session['admin_id']=data[0].ID;
더 많은 프로그래밍 관련 지식을 보려면프로그래밍 비디오를 방문하세요! !
위 내용은 nodejs의 쿠키와 세션을 살펴보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!