01. 쿠키와 세션
- 쿠키(Cookie): 브라우저가 서버로부터 응답으로 Set-Cookie 헤더를 받은 경우 해당 데이터를 저장한 뒤 모든 요청에 포함하여 보낸다.
==> 데이터를 여러 사이트에 공유할 수 있어서 보안에 취약할 수 있다.
==> 쿠키 간에는 세미콜론(;)으로 구분 - 세션(Session): 쿠키를 기반인 기술, 세션은 쿠키의 보안 단점을 보완해서 데이터를 서버에만 저장한다. But 사용자가 많은 경우 서버에 저장해야 할 데이터가 많아져서 서버 컴퓨터가 감당하지 못하는 문제가 생기기 쉽다.
- cookie-parser 미들웨어를 적용하여 쿠키 사용하기
const express = require("express");
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser());
app.get("/set", (req, res) => {
res.cookie('name', 'nodejs');
return res.status(200).end();
});
app.get("/get", (req, res) => {
const cookie = req.cookies;
return res.status(200).json({ cookie });
});
app.listen(5001, () => {
console.log("서버가 켜졌어요!");
});
- 세션(Session) 만들어보기
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser());
let session = {};
app.get('/set-session', function (req, res, next) {
const name = 'sparta';
const uniqueInt = Date.now();
session[uniqueInt] = { name };
res.cookie('sessionKey', uniqueInt);
return res.status(200).end();
});
app.get('/get-session', function (req, res, next) {
const { sessionKey } = req.cookies;
const name = session[sessionKey];
return res.status(200).json({ name });
});
app.listen(5002, () => {
console.log("서버가 켜졌어요!");
});
02. JWT
- JWT란?
==> JSON형태의 데이터를 안전하게 교환하여 사용 가능하준다.
==> 인터넷 표준으로서 자리잡은 규격
==> 여러가지 암호화 알고리즘을 사용 가능
==> header. payload. signature의 형식으로 3가지의 데이터를 포함한다.
==> 비밀 키를 모르더라도 복호화(Decode)가 가능하다.(민감한 정보는 되도록 담지 않아야 한다.
==> 특정 언어에서만 사용하는게 아니다. - 쿠키, 세션과 차이점
==> 쿠키/세션: 데이터를 교환, 관리하는 방식 / JWT: 데이터를 표현하는 형식
==> JWT로 만든 데이터는 브라우저로 보내도 쿠키처럼 자동으로 저장되지 않는다. 변조가 거의 불가능, 서버에 데이터를 저장하지 않기 때문에 서버를 Stateless(무상태)로 관리할 수 있다. (최근 많이 사용중)
==> Stateless(무상태): 서버가 언제든 주었다 살아나도 똑같은 동작 /
Stateful(상태 보존): 서버가 죽었다 살아났을 때 동작이 달라진다.
==> 서버가 스스로 어떤 기억을 갖고 어떤 결정을 하느냐의 차이
==> 로그인 정보를 서버에 저장하게 되면 무조건 Stateful(상태 보존)

03. JWT 사용하기
- 오픈소스 라이브러리 사용 (jsonwebtoken)
npm init -y
npm install jsonwebtoken
- 데이터 암호화
const jwt = require("jsonwebtoken");
const token = jwt.sign({ myPayloadData: 1234 }, "mysecretkey");
console.log(token); // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2Njc1NjE0NDB9.nvYSsLsT8jp7IfkbB2seCNeuLqRBgrrzDjKRFXjvoUE
- 복호화
const jwt = require("jsonwebtoken");
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2Njc1NjE0NDB9.nvYSsLsT8jp7IfkbB2seCNeuLqRBgrrzDjKRFXjvoUE";
const decodedValue = jwt.decode(token);
console.log(decodeValue); // { myPayloadData: 1234, iat: 1667561440 }
- 복호화가 아닌, 변조되지 않은 데이터인지 검증
const jwt = require("jsonwebtoken");
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2Njc1NjE0NDB9.nvYSsLsT8jp7IfkbB2seCNeuLqRBgrrzDjKRFXjvoUE";
const decodedValueByVerify = jwt.verify(token, "mysecretkey");
console.log(decodedValueByVerify); // { myPayloadData: 1234, iat: 1667561440 }
==> 변조된 코드라면 위의 코드에서 에러가 발생
- JWT를 써야 하는 이유?
- 인증 서버에서 발급되었는지 위변조 여부를 확인할 수 있다.
- 누구든지 JWT내부에 들어있는 정보를 확인할 수 있다.
- 사용자 정보를 Payload에 저장
- JWT생성 시 위변조 여부를 확인할 수 있는 비밀키를 사용한다.
- JWT의 만료시간은 설정할 수 있다.
'JavaScript Dev. > Node.js' 카테고리의 다른 글
sequelize (0) | 2023.05.06 |
---|---|
미들웨어(Middleware) (0) | 2023.05.01 |
AWS 배포하기 (feat. EC2) (0) | 2023.04.25 |
Git 이용하기 (0) | 2023.04.24 |
MongoDB, mongoose (0) | 2023.04.24 |
01. 쿠키와 세션
- 쿠키(Cookie): 브라우저가 서버로부터 응답으로 Set-Cookie 헤더를 받은 경우 해당 데이터를 저장한 뒤 모든 요청에 포함하여 보낸다.
==> 데이터를 여러 사이트에 공유할 수 있어서 보안에 취약할 수 있다.
==> 쿠키 간에는 세미콜론(;)으로 구분 - 세션(Session): 쿠키를 기반인 기술, 세션은 쿠키의 보안 단점을 보완해서 데이터를 서버에만 저장한다. But 사용자가 많은 경우 서버에 저장해야 할 데이터가 많아져서 서버 컴퓨터가 감당하지 못하는 문제가 생기기 쉽다.
- cookie-parser 미들웨어를 적용하여 쿠키 사용하기
const express = require("express");
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser());
app.get("/set", (req, res) => {
res.cookie('name', 'nodejs');
return res.status(200).end();
});
app.get("/get", (req, res) => {
const cookie = req.cookies;
return res.status(200).json({ cookie });
});
app.listen(5001, () => {
console.log("서버가 켜졌어요!");
});
- 세션(Session) 만들어보기
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser());
let session = {};
app.get('/set-session', function (req, res, next) {
const name = 'sparta';
const uniqueInt = Date.now();
session[uniqueInt] = { name };
res.cookie('sessionKey', uniqueInt);
return res.status(200).end();
});
app.get('/get-session', function (req, res, next) {
const { sessionKey } = req.cookies;
const name = session[sessionKey];
return res.status(200).json({ name });
});
app.listen(5002, () => {
console.log("서버가 켜졌어요!");
});
02. JWT
- JWT란?
==> JSON형태의 데이터를 안전하게 교환하여 사용 가능하준다.
==> 인터넷 표준으로서 자리잡은 규격
==> 여러가지 암호화 알고리즘을 사용 가능
==> header. payload. signature의 형식으로 3가지의 데이터를 포함한다.
==> 비밀 키를 모르더라도 복호화(Decode)가 가능하다.(민감한 정보는 되도록 담지 않아야 한다.
==> 특정 언어에서만 사용하는게 아니다. - 쿠키, 세션과 차이점
==> 쿠키/세션: 데이터를 교환, 관리하는 방식 / JWT: 데이터를 표현하는 형식
==> JWT로 만든 데이터는 브라우저로 보내도 쿠키처럼 자동으로 저장되지 않는다. 변조가 거의 불가능, 서버에 데이터를 저장하지 않기 때문에 서버를 Stateless(무상태)로 관리할 수 있다. (최근 많이 사용중)
==> Stateless(무상태): 서버가 언제든 주었다 살아나도 똑같은 동작 /
Stateful(상태 보존): 서버가 죽었다 살아났을 때 동작이 달라진다.
==> 서버가 스스로 어떤 기억을 갖고 어떤 결정을 하느냐의 차이
==> 로그인 정보를 서버에 저장하게 되면 무조건 Stateful(상태 보존)

03. JWT 사용하기
- 오픈소스 라이브러리 사용 (jsonwebtoken)
npm init -y
npm install jsonwebtoken
- 데이터 암호화
const jwt = require("jsonwebtoken");
const token = jwt.sign({ myPayloadData: 1234 }, "mysecretkey");
console.log(token); // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2Njc1NjE0NDB9.nvYSsLsT8jp7IfkbB2seCNeuLqRBgrrzDjKRFXjvoUE
- 복호화
const jwt = require("jsonwebtoken");
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2Njc1NjE0NDB9.nvYSsLsT8jp7IfkbB2seCNeuLqRBgrrzDjKRFXjvoUE";
const decodedValue = jwt.decode(token);
console.log(decodeValue); // { myPayloadData: 1234, iat: 1667561440 }
- 복호화가 아닌, 변조되지 않은 데이터인지 검증
const jwt = require("jsonwebtoken");
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2Njc1NjE0NDB9.nvYSsLsT8jp7IfkbB2seCNeuLqRBgrrzDjKRFXjvoUE";
const decodedValueByVerify = jwt.verify(token, "mysecretkey");
console.log(decodedValueByVerify); // { myPayloadData: 1234, iat: 1667561440 }
==> 변조된 코드라면 위의 코드에서 에러가 발생
- JWT를 써야 하는 이유?
- 인증 서버에서 발급되었는지 위변조 여부를 확인할 수 있다.
- 누구든지 JWT내부에 들어있는 정보를 확인할 수 있다.
- 사용자 정보를 Payload에 저장
- JWT생성 시 위변조 여부를 확인할 수 있는 비밀키를 사용한다.
- JWT의 만료시간은 설정할 수 있다.
'JavaScript Dev. > Node.js' 카테고리의 다른 글
sequelize (0) | 2023.05.06 |
---|---|
미들웨어(Middleware) (0) | 2023.05.01 |
AWS 배포하기 (feat. EC2) (0) | 2023.04.25 |
Git 이용하기 (0) | 2023.04.24 |
MongoDB, mongoose (0) | 2023.04.24 |