[Node.Js] 섹션 1. cookie

2022. 7. 12. 19:04·Hacking/Web Hacking

1-1. cookie 1 : intro

cookie : 방문한 웹사이트에서 생성된 파일

인터넷 사용정보를 저장하기 때문에 쿠키를 사용하면 사이트에서 로그인 상태를 유지하고 사이트 환경설정을 기억하며 지역 관련 콘텐츠를 제공할 수 있다.

 

cookie는 사용자마다 다른 상태를 유지할 수 있다.

검사 → resources → cookie를 삭제하면 count가 0으로 초기화되는 것을 확인할 수 있다.

cookie의 response headers에서 set-cookie를 통해 cookie의 값을 알 수 있다.

node.js를 이용해서 set-cookie의 count에 +1을 하라고 명령하면 웹 브라우저는 명령을 따라 값을 바꾸고 다음 접속에는 값이 바뀌게 되는 것이다.

 

1-2. cookie 2 - counter

var express = require('express');
var app = express();
app.listen(3003, function(){console.log('Connected 3003 port!!!');
});

기본 템플릿이다.

 

var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();
app.use(cookieParser());
app.get('/count', function(req, res) {
	res.cookie('count', 1);
	res.send('count : '+req.cookies.count);
});
app.listen(3003, function(){console.log('Connected 3003 port!!!');
});

cookie를 사용하기 위해 추가한 코드이다.

웹서버에서 웹브라우저에 응답할 때 카운트라고 하는 쿠키의 값을 1을 세팅해서 웹브라우저에 보낸다.

set-cookie의 값에 count=1이라는 쿠키 값이 추가되었다.

localhost:3003으로 접속하게 되면 쿠키는 count=1이라는 값을 전송하게 된다.

 

res 안에는 쿠키 파서로 인해 쿠키라는 메소드가 생겼고, 여기에 count를 1을 주고 실행하면 

request의 cookie값에 count=1이 추가된 것을 확인할 수 있다.

웹 브라우저를 확인하면

count : 1로 변한 것을 확인할 수 있다.

 

cookie-parser을 설치하는 방법이 적혀 있는 링크이다.

해당 문서를 따라 콘솔에 설치해주면 된다.

https://expressjs.com/en/4x/api.html

 

Express 4.x - API Reference

Express 4.x API express() Creates an Express application. The express() function is a top-level function exported by the express module. var express = require('express') var app = express() Methods express.json([options]) This middleware is available in Ex

expressjs.com

 

var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();
app.use(cookieParser());
app.get('/count', function(req, res) {
	if(res.cookies.count){
    	var count = parseInt(res.cookies.count);
    } else {
    	var count = 0;
    }
    count = count + 1
	res.cookie('count', count);
	res.send('count : '+req.cookies.count);
});
app.listen(3003, function(){console.log('Connected 3003 port!!!');
});

count가 1씩 증가할 수 있도록 구현한 코드이다.

res.cookie.count가 0이 아니라면 count는 count의 값을 가지되,cookie로 받은 값은 기본적으로 문자이기 때문에 parseInt로 정수 값으로 바꿔준다.

이후 count+1을 통해 count 값이 1씩 늘어나고 이것이 화면에 반영된다.

 

1-3. cookie 3 - 쇼핑카트 1

var cookieParser = require('cookie-parser');
var app = express();
app.use(cookieParser());
var products = {
  1:{title:'The history of web 1'},
  2:{title:'The next web'}
};
app.get('/products', function(req, res){
  var output = '';
  for(var name in products) {
    output += `
      <li>
        <a href="/cart/${name}">${products[name].title}</a>
      </li>`
  }
  res.send(`<h1>Products</h1><ul>${output}</ul><a href="/cart">Cart</a>`);
});

app.get('/count', function(req, res){
  if(req.cookies.count){
    var count = parseInt(req.cookies.count);
  } else {
    var count = 0;
  }
  count = count+1;
  res.cookie('count', count);
  res.send('count : ' + count);
});
app.listen(3003, function(){
  console.log('Connected 3003 port!!!');
});

products 배열에 1번 속성으로 web1, 2번 속성으로 web2를 사용한다.

현장에서는 DB를 사용한다. (SQL 등...)

 

for문을 이용해서 products의 값들을 name으로 꺼낸다.

output에  name으로 꺼내진 원소들을 더한다. 

변수로 인식되기 위해 ${}, 목록으로 인식되기 위해 <li> 태그를 준다.

 

링크로 사용하기 위해 <a href> </a>태그를 이용한다.

url에 아이디 값을 추가해서 인식에 용이하게 한다.

 

1-4. cookie 4 - 쇼핑카트 2

app.get('/cart/:id', function(req, res){
	var id = req.params.id;
    if(req.cookies.cart) {
    	var cart = req.cookies.cart;
    } else {
    	var cart = {};
    }
    if(!cart[id]){
    	cart[id] = 0;
    }
    cart[id] = parseInt(cart[id])+1;
    res.cookie('cart', cart);
    res.redirect('/cart');
});

추가된 코드 부분이다. 

request의 cookies의 cart 값이 세팅되어 있다면 그 값을 사용하고, 그렇지 않다면 cart 값을 비어 있는 객체를 cookie의 값으로 세팅한다.

cart의 id 값을 이용해서 담은 물품 개수를 확인한다.

 

1-5. cookie 5 - 쇼핑카트 3

app.get('/cart', function(req, res){
	var cart = req.cookies.cart;
    if(!cart) {
    	res.rend('Empty!');
    } else {
    	var output = '';
    	for(var id in cart){
        	output += `<li>${products[id].title} (${cart[id]})</li>`;
    	}
    }
    res.send(`
    	<h1>Cart</h1>
    	<ul>${output}</ul>
    	<a href="/products">Products List</a>
    `);
});

카트 목록을 꾸며주는 과정이다.

cart에 값이 없다면 Empty!를 출력하고, 값이 들어 있다면 cart에 들어 있는 목록을 <li>를 통해서 이름과 개수를 목록으로 출력한다.

<li> 태그가 사용되었기 때문에 send에 <ul> 태그를 추가한다.

 

1-6. cookie 6 - cookie & 보안

cookie를 서버와 브라우저가 교환하는 과정에서 도청당하거나 탈취당할 수 있다.

또한 cookie는 저장된 파일이기 때문에 해킹당할 시 매우 위험하다.

 

이를 방지하기 위해 암호화를 위한 키 값을 지정할 수 있다.

cookieParser 안에 임의의 키 값을 입력하고 암호화해 암호화된 상태로 저장했다가 서버에 request할 때 암호화 된 정보를 그대로 보내주면 키 값을 이용해서 암호화된 정보를 해석할 수 있다.

 

var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();
app.use(cookieParser('23879ASDF234sdf@!#$a'));
var products = {
  1:{title:'The history of web 1'},
  2:{title:'The next web'}
};
app.get('/products', function(req, res){
  var output = '';
  for(var name in products) {
    output += `
      <li>
        <a href="/cart/${name}">${products[name].title}</a>
      </li>`
  }
  res.send(`<h1>Products</h1><ul>${output}</ul><a href="/cart">Cart</a>`);
});
app.get('/cart/:id', function(req, res){
  var id = req.params.id;
  if(req.signedCookies.cart) {
    var cart = req.signedCookies.cart;
  } else {
    var cart = {};
  }
  if(!cart[id]){
    cart[id] = 0;
  }
  cart[id] = parseInt(cart[id])+1;
  res.cookie('cart', cart, {signed:true});
  res.redirect('/cart');
});
app.get('/cart', function(req, res){
  var cart = req.signedCookies.cart;
  if(!cart) {
    res.rend('Empty!');
  } else {
    var output = '';
    for(var id in cart){
      output += `<li>${products[id].title} (${cart[id]})</li>`;
    }
  }
  res.send(`
    <h1>Cart</h1>
    <ul>${output}</ul>
    <a href="/products">Products List</a>
  `);
});

app.get('/count', function(req, res){
  if(req.signedCookies.count){
    var count = parseInt(req.signedCookies.count);
  } else {
    var count = 0;
  }
  count = count+1;
  res.cookie('count', count, {signed:true});
  res.send('count : ' + count);
});
app.listen(3003, function(){
  console.log('Connected 3003 port!!!');
});

cookie 값을 입력받는 부분에 signed를 추가하고, cookie 값을 입력하는 부분에 signed:true를 추가한다.

이렇게 보호해도 털릴 수 있기 때문에 중요한 값은 cookie에 저장하지 않는다.

'Hacking/Web Hacking' 카테고리의 다른 글
  • Node.js
  • [Node.Js] 섹션 2. session
  • [Node.Js] 섹션 0. HTTP
  • 생활코딩 WEB2 - JavaScript
단축키실행해보세요
단축키실행해보세요
공대생
  • 단축키실행해보세요
    Ctrl + Shift + ESC
    단축키실행해보세요
  • 전체
    오늘
    어제
    • 분류 전체보기 (170)
      • 외부 활동 (4)
      • BOJ (36)
        • Python (24)
        • C++ (12)
        • Java (0)
      • Hacking (91)
        • Crypto (4)
        • Forensics (2)
        • Mobile Hacking (5)
        • Reversing (21)
        • System (21)
        • Web Hacking (38)
      • Cloud (14)
        • Serverless (1)
        • AWS (8)
      • ML (4)
      • Data Structure (16)
      • Git (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    AI
    python
    EC2
    XPath
    htmlinjection
    pwnable
    유석종교수님
    ML
    CodeEngn
    Dreamhack
    beebox
    SISS
    Redis
    AWS
    Reflected
    S3
    Reversing
    bWAPP
    basicrce3
    Systemhacking
    backjoon
    acc
    백준
    자료구조
    System
    datastructure
    c
    SAA
    부하테스트
    cloud
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
단축키실행해보세요
[Node.Js] 섹션 1. cookie
상단으로

티스토리툴바