웹 프로그래밍

[JS] 쿠키

미안하다 강림이 좀 늦었다 2023. 11. 17. 01:55

 

 

쿠키 보내기

웹 사이트 방문자에게 쿠키를 보내봅시다.

const colors = require('colors');
const express = require('express');
const app = express();

app.listen(3000, () => {
    console.log('Listening on port 3000!'.yellow)
})

app.get('/setname', (req, res) => {
    res.cookie('name', 'ganglim');
    res.send('쿠키를 전송했습니다');
})

쿠키가 제대로 설정되었습니다.

 

 

쿠키 parser 미들웨어

쿠키를 파싱하려면 cookie-parser라는 패키지를 설치해야 합니다.

cmd에서 npm i cookie-parser를 해줍니다.

아래 코드를 기존 코드에 추가합니다.

const cookieParser = require('cookie-parser');
app.use(cookieParser());

app.get('/greet', (req, res) => {
    const { name = 'NoName' } = req.cookies;
    res.send(`Welcome back, ${name}!`);
})

 

쿠키가 없을 경우
쿠키가 있을 경우

 

 

쿠키 서명하기

쿠키에 서명을 하면 쿠키의 조작 유무를 알 수 있습니다.

쿠키에 'ganglim'이라는 문자열(비밀키)로 서명을 합니다.

app.use(cookieParser('ganglim'));

app.get('/getsignedcookie', (req, res) => {
    res.cookie('season', 'winter', { signed: true });
    res.send('쿠키에 서명했습니다');
})

쿠키에 서명을 하면 쿠키 값에 이상한게 붙기는 하지만 값 사이에서 원래 값으로 설정했던 'winter'를 볼 수 있습니다. 쿠키에 서명을 하는 목적은 남들에게 숨기는 것이 아닙니다.

 

모든 쿠키들을 응답으로 보내봅시다.

app.get('/verifyseason', (req, res) => {
    res.send(req.cookies);
})

모든 쿠키들을 응답으로 보내줬지만 서명된 쿠키인 season은 볼 수 없습니다. request.cookies 안에는 서명된 쿠키가 포함되지 않기 때문입니다. 그 이유는 서명된 쿠키와 일반적인 무서명 쿠키를 명확히 구분하기 위함입니다.

 

그럼 서명된 쿠키들을 응답으로 보내봅시다.

app.get('/verifyseason', (req, res) => {
    // res.send(req.cookies);
    res.send(req.signedCookies);
})

서명된 쿠키들이 정상적으로 보입니다.

 

이번에는 서명된 쿠키를 조작해봅시다.

'winter' 부분을 'summer'로 조작하면 'season'이 false로 바뀐 것을 볼 수 있습니다. 파서가 포맷을 보고 서명을 확인해야겠다고 결정합니다. 확인 결과 누군가가 이것을 변경했다는 것을 알아차려 false로 알려줍니다.

 

추가로, 현재 비밀키는 'ganglim'이지만 비밀키를 다른 것으로 변경하면 'ganglim'이라는 비밀키로 서명되었던 쿠키들은 모두 무효화됩니다.