여기에 답이 무시하는 질문 의이 부분을 반복하겠습니다.
타사 라이브러리를 가져올 필요없이 몇 줄의 코드로 수행 할 수 있습니까?
쿠키 읽기
쿠키는 Cookie
헤더 가있는 요청에서 읽습니다 . 그들은 단지 포함 name
와 value
. 경로가 작동하는 방식으로 인해 동일한 이름의 여러 쿠키가 전송 될 수 있습니다. NodeJS에서 모든 쿠키는 Cookie
헤더에 전송 될 때 하나의 문자열로 표시됩니다 . 으로 나누었습니다 ;
. 쿠키가 있으면 등호 (있는 경우)의 왼쪽에있는 name
모든 것이이고 이후의 모든 것은 value
입니다. 일부 브라우저는 등호가없는 쿠키를 허용하고 이름을 비워 둔 것으로 가정합니다. 공백은 쿠키의 일부로 계산되지 않습니다. 값은 큰 따옴표 ( "
)로 묶을 수도 있습니다 . 값은을 포함 할 수도 있습니다 =
. 예를 들어 formula=5+3=8
유효한 쿠키입니다.
/**
* @param {string} [cookieString='']
* @return {[string,string][]} String Tuple
*/
function getEntriesFromCookie(cookieString = '') {
return cookieString.split(';').map((pair) => {
const indexOfEquals = pair.indexOf('=');
let name;
let value;
if (indexOfEquals === -1) {
name = '';
value = pair.trim();
} else {
name = pair.substr(0, indexOfEquals).trim();
value = pair.substr(indexOfEquals + 1).trim();
}
const firstQuote = value.indexOf('"');
const lastQuote = value.lastIndexOf('"');
if (firstQuote !== -1 && lastQuote !== -1) {
value = value.substring(firstQuote + 1, lastQuote);
}
return [name, value];
});
}
const cookieEntries = getEntriesFromCookie(request.headers.Cookie);
const object = Object.fromEntries(cookieEntries.slice().reverse());
중복 된 이름을 기대하지 않으면 작업을보다 쉽게 수행 할 수있는 개체로 변환 할 수 있습니다. 그런 다음 object.myCookieName
가치를 얻는 것처럼 접근 할 수 있습니다 . 중복이 예상되는 경우을 반복하고 싶습니다 cookieEntries
. 브라우저는 내림차순으로 쿠키를 공급하므로 역전은 객체에 가장 높은 우선 순위 쿠키가 표시되도록합니다. (이것은 .slice()
배열의 돌연변이를 피하는 것입니다.)
설정 쿠키
"쓰기"쿠키는 Set-Cookie
응답에 헤더를 사용하여 수행됩니다 . response.headers['Set-Cookie']
객체는 실제로 배열입니다, 그래서 당신은 그것을 밀고됩니다. 문자열을 허용하지만 name
and 보다 더 많은 값을 갖습니다 value
. 가장 어려운 부분은 문자열을 작성하는 것이지만 한 줄로 수행 할 수 있습니다.
/**
* @param {Object} options
* @param {string} [options.name='']
* @param {string} [options.value='']
* @param {Date} [options.expires]
* @param {number} [options.maxAge]
* @param {string} [options.domain]
* @param {string} [options.path]
* @param {boolean} [options.secure]
* @param {boolean} [options.httpOnly]
* @param {'Strict'|'Lax'|'None'} [options.sameSite]
* @return {string}
*/
function createSetCookie(options) {
return (`${options.name || ''}=${options.value || ''}`)
+ (options.expires != null ? `; Expires=${options.expires.toUTCString()}` : '')
+ (options.maxAge != null ? `; Max-Age=${options.maxAge}` : '')
+ (options.domain != null ? `; Domain=${options.domain}` : '')
+ (options.path != null ? `; Path=${options.path}` : '')
+ (options.secure ? '; Secure' : '')
+ (options.httpOnly ? '; HttpOnly' : '')
+ (options.sameSite != null ? `; SameSite=${options.sameSite}` : '');
}
const newCookie = createSetCookie({
name: 'cookieName',
value: 'cookieValue',
path:'/',
});
response.headers['Set-Cookie'].push(newCookie);
Set-Cookie
요청에 실제로 여러 헤더를 설정할 수 있으므로 여러 쿠키를 설정할 수 있습니다 . 그것이 배열 인 이유입니다.
외부 라이브러리에 대한 참고 사항 :
당신은을 사용하기로 결정한 경우 express
, cookie-parser
또는 cookie
, 그들은 비 표준 기본값을 가지고 있습니다. 구문 분석 된 쿠키는 항상 URI 디코딩 (퍼센트 디코딩)됩니다. 즉, 다음 문자가 포함 된 이름 또는 값을 사용하는 경우 !#$%&'()*+/:<=>?@[]^`{|}
해당 라이브러리에서 다르게 처리됩니다. 쿠키를 설정하는 경우 쿠키가로 인코딩됩니다 %{HEX}
. 쿠키를 읽는다면 쿠키를 해독해야합니다.
예를 들어, email=name@domain.com
쿠키는 유효한 쿠키이지만이 라이브러리는 쿠키를로 인코딩합니다 email=name%40domain.com
. %
쿠키를 사용하는 경우 디코딩에 문제가 발생할 수 있습니다 . 엉망이 될 것입니다. 예를 들어,이었다 쿠키는 : secretagentlevel=50%007and50%006
이된다 secretagentlevel=507and506
. 그것은 극단적 인 경우이지만 라이브러리를 전환 할 때주의해야 할 사항입니다.
또한 이러한 라이브러리에서 쿠키는 기본값으로 설정되어 path=/
모든 URL 요청시 호스트로 전송됩니다.
당신이 인코딩을 원하거나이 값을 직접 디코딩하는 경우 사용할 수 있습니다 encodeURIComponent
또는 decodeURIComponent
각각.
참고 문헌 :
추가 정보:
=
에 Facebook 쿠키와 같은 등호 ( ) 가 포함되어 있으면 위의 코드가 제대로 작동하지 않습니다fbm_1234123412341234=base_domain=.domain.com
.