익스프레스 프레임워크를 사용하여 노드 J에서 쿠키를 설정하려면 어떻게 해야 합니까?
내 애플리케이션에서, 나는 익스프레스 프레임워크를 사용하여 쿠키를 설정해야 합니다.다음 코드를 시도해 보았지만 쿠키가 설정되어 있지 않습니다.
var express = require('express'), http = require('http');
var app = express();
app.configure(function(){
app.use(express.cookieParser());
app.use(express.static(__dirname + '/public'));
app.use(function (req, res) {
var randomNumber=Math.random().toString();
randomNumber=randomNumber.substring(2,randomNumber.length);
res.cookie('cokkieName',randomNumber, { maxAge: 900000, httpOnly: true })
console.log('cookie have created successfully');
});
});
var server = http.createServer(app);
var io = require('socket.io').listen(server);
server.listen(5555);
Express에서 미들웨어를 사용하는 순서가 중요합니다. 이전에 선언된 미들웨어가 먼저 호출되고 요청을 처리할 수 있는 경우 나중에 선언된 미들웨어는 호출되지 않습니다.
한다면express.static
요청을 처리하는 중이므로 미들웨어를 위로 이동해야 합니다.
// need cookieParser middleware before we can do anything with cookies
app.use(express.cookieParser());
// set a cookie
app.use(function (req, res, next) {
// check if client sent cookie
var cookie = req.cookies.cookieName;
if (cookie === undefined) {
// no: set a new cookie
var randomNumber=Math.random().toString();
randomNumber=randomNumber.substring(2,randomNumber.length);
res.cookie('cookieName',randomNumber, { maxAge: 900000, httpOnly: true });
console.log('cookie created successfully');
} else {
// yes, cookie was already present
console.log('cookie exists', cookie);
}
next(); // <-- important!
});
// let static middleware do its job
app.use(express.static(__dirname + '/public'));
또한 미들웨어는 응답을 보내 요청을 종료하거나 다음 미들웨어로 요청을 전달해야 합니다.이 경우에는, 제가 전화를 해서 후자를 했습니다.next()
쿠키가 설정된 경우.
갱신하다
현재 쿠키 파서는 별도의 엔피엠 패키지이므로 사용하는 대신
app.use(express.cookieParser());
다음을 사용하여 별도로 설치해야 합니다.npm i cookie-parser
다음과 같이 사용합니다.
const cookieParser = require('cookie-parser');
app.use(cookieParser());
세트 쿠키?
res.cookie('cookieName', 'cookieValue')
쿠키를 읽습니까?
req.cookies
데모
const express('express')
, cookieParser = require('cookie-parser'); // in order to read cookie sent from client
app.get('/', (req,res)=>{
// read cookies
console.log(req.cookies)
let options = {
maxAge: 1000 * 60 * 15, // would expire after 15 minutes
httpOnly: true, // The cookie only accessible by the web server
signed: true // Indicates if the cookie should be signed
}
// Set cookie
res.cookie('cookieName', 'cookieValue', options) // options is optional
res.send('')
})
질문에 정확하게 답하지는 못했지만, 제가 가지고 있는 문제에 대한 답을 찾던 중에 질문을 발견했습니다.아마 다른 누군가에게 도움이 될 것입니다.
문제는 쿠키가 서버 응답에 설정되었지만 브라우저에 의해 저장되지 않았다는 것입니다.
서버 응답이 쿠키 집합과 함께 반환되었습니다.
Set-Cookie:my_cookie=HelloWorld; Path=/; Expires=Wed, 15 Mar 2017 15:59:59 GMT
이렇게 풀었습니다.
사용한fetch
클라이언트 측 코드에서.지정하지 않은 경우credentials: 'include'
에서fetch
서버 응답이 쿠키를 설정하더라도 쿠키는 서버로 전송되거나 브라우저에 의해 저장되지 않습니다.
예:
var headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Accept', 'application/json');
return fetch('/your/server_endpoint', {
method: 'POST',
mode: 'same-origin',
redirect: 'follow',
credentials: 'include', // Don't forget to specify this if you need cookies
headers: headers,
body: JSON.stringify({
first_name: 'John',
last_name: 'Doe'
})
})
쿠키 설정:
res.cookie('cookie', 'monster')
https://expressjs.com/en/4x/api.html#res.cookie
쿠키 읽기:
(쿠키 파서 미들웨어 사용)
req.cookies['cookie']
https://expressjs.com/en/4x/api.html#req.cookies
급행에 쿠키를 설정하는 것은 쉽습니다.
- 쿠키 파서를 처음 설치합니다.
npm install cookie-parser
- 미들웨어 사용
const cookieParser = require('cookie-parser');
app.use(cookieParser());
- 쿠키에 대한 자세한 정보 설정
res.cookie('cookieName', '1', { expires: new Date(Date.now() + 900000), httpOnly: true })
console.dir(req.cookies.cookieName)
알았어!
쿠키 설정은 다음과 같이 수행할 수 있습니다.
res.cookie('cookie name', 'cookie value', [options])
여기서 cookie_name은 설정할 쿠키의 이름(String)입니다(예: "token"). cookie 값은 해당 쿠키에 저장할 값(String)입니다.옵션에 대한 자세한 내용은 여기에서 확인할 수 있습니다. https://expressjs.com/en/api.html
옵션의 한 예로 쿠키가 유효한 기간을 나타내는 'maxAge'가 있습니다. 예를 들어 인증 토큰을 할당할 때 사용되며 사용자가 다시 로그인해야 할 때까지 로그인할 수 있는 시간을 제한하려고 합니다.
쿠키 읽기는 다음과 같이 수행할 수 있습니다.
req.cookies['cookie name']
쿠키의 값을 반환합니다.
요청 하나에 대해 여러 쿠키를 설정하는 데 문제가 있는 경우
다음 방법을 사용해 보십시오.
res.setHeader('Set-Cookie', [
`accessToken=${accessToken}; HttpOnly; Path=/; Max-Age=${60 * 60}; Secure=True;`,
`refreshToken=${refreshToken}; HttpOnly; Path=/; Max-Age=${60 * 60 * 24 * 7 * 2}; Secure=True;`
]);
등형 읽기 쿠키 도우미:
function getCookieValue(cookieName = '', cookie = '') {
const matches = cookie.match(`(^|[^;]+)\\s*${cookieName}\\s*=\\s*([^;]+)`)
return matches ? matches.pop() : ''
}
// Node with express:
getCookieValue('cookieName', req.headers.cookie)
// Browser:
getCookieValue('cookieName', document.cookie)
express를 사용하여 노드에 쓰기:
res.cookie('cookieName', 'cookieValue')
브라우저에서 쓰기:
function setCookie(
cname,
cvalue,
exdays = 100 * 365 /* 100 days */
) {
const now = new Date()
const expireMs = exdays * 24 * 60 * 60 * 1000
now.setTime(now.getTime() + expireMs)
document.cookie = `${cname}=${cvalue};expires=${now.toUTCString()};path=/`
}
// Example of usage
setCookie('cookieName', 'cookieValue')
이것이 당신에게 도움이 될 것 같습니다.axios에서 요청을 보내다가 동일한 문제가 발생하여 credential 등에 오류가 발생하였습니다.이를 위해서는 백엔드에서 cors()를 사용해야 하며, 다음과 같이 cors 옵션을 사용해야 합니다.
npm i cors;
코르스가 성공적으로 설치된 후.main server.js 파일로 가져오기
const cors = require('cors');
그리고 그 이후에는 라우팅하기 전에 코르스 미들웨어를 사용합니다.미들웨어를 어디에 두느냐가 중요합니다.그래서 경로 위에 코르스를 배치합니다.
var corsoption={
origin:"http://localhost:3000", //origin from where you requesting
credentials:true
}
//using cors
app.use(cors(corsoption));
이러한 옵션을 응답으로 쿠키 전송으로 설정한 후에만 브라우저에서 쿠키를 올바르게 설정하고 자격 증명으로 교차 오리진을 허용합니다.참고: 백엔드에서 쿠키를 구문 분석하려면 설치해야 합니다.
쿠키 파서
브라우저 요청에서 쿠키를 구문 분석합니다.
언급URL : https://stackoverflow.com/questions/16209145/how-can-i-set-cookie-in-node-js-using-express-framework
'programing' 카테고리의 다른 글
Node.js 오류: 'mongoose' 모듈을 찾을 수 없습니다. (0) | 2023.05.25 |
---|---|
반환된 값이 null인 경우 postgresql이 0을 반환합니다. (0) | 2023.05.25 |
EC2: sudo 노드 명령을 찾을 수 없지만 sudo가 없는 노드는 정상입니다. (0) | 2023.05.25 |
인코딩이 없는 ASP.NET MVC 레이저 렌더 (0) | 2023.05.25 |
Azure AD B2C - 역할 관리 (0) | 2023.05.25 |