학습 내용 정리/기본
쿠키와 세션, JWT
verdantjuly
2023. 6. 22. 19:46
728x90
쿠키
브라우저가 서버로부터 응답으로 Set-Cookie 헤더를 받은 경우 저장한 해당 데이터. 모든 요청에 포함하여 보낸다.
- 데이터를 여러 사이트에 공유할 수 있기 때문에 보안에 취약
cookie-parser 미들웨어를 사용하면 더 쉽게 쿠키를 관리할 수 있다. 객체 형식이라!
// Set-cookie를 이용해 쿠키 만들기
app.get("/set-cookie", (req, res) => {
let expire = new Date();
expire.setMinutes(expire.getMinutes() + 60); // 만료 시간을 60분으로 설정합니다.
res.writeHead(200, {
'Set-Cookie': `name=sparta; Expires=${expire.toGMTString()}; HttpOnly; Path=/`,
});
return res.status(200).end();
});
res.cookie를 이용해 쿠키 만들기
app.get("/set-cookie", (req, res) => {
let expires = new Date();
expires.setMinutes(expires.getMinutes() + 60); // 만료 시간을 60분으로 설정합니다.
res.cookie('name', 'sparta', {
expires: expires
});
return res.status(200).end();
});
//req.headers.cookie 를 이용해 쿠키 꺼내기
app.get("/get-cookie", (req, res) => {
const cookie = req.headers.cookie;
console.log(cookie); // name=sparta
return res.status(200).json({ cookie });
});
세션
데이터를 서버에만 저장
- 사용자가 많은 경우 서버 과부하
// 세션 저장하기
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 });
});
JWT : jsonwebtoken
설치 : npm install jsonwebtoken
JSON 형태의 데이터를 안전하게 교환
json 형식으로 만든 웹 열쇠
(어딘가에 접근하려고 할 때 열쇠가 있으면 접근 가능!)
보안 문 들어가려 함 : 정직원이 들어가면 : 인증
보안 문 들어가려 함 : 카드를 빌린 친구가 들어가면 : 인가
header.payload.signature
- header : signature에서 어떤 암호화를 사용하여 생성된 데이터인지 표현합니다.
- payload : 개발자가 원하는 데이터를 저장합니다.
- signature : 이 토큰이 변조되지 않은 정상적인 토큰인지 확인할 수 있게 도와줍니다.
- iat : 토큰이 발급된 시간 (issued at)
JWT는 비밀 키를 모르더라도 복호화(Decode)가 가능합니다.
변조만 불가능 할 뿐, 누구나 복호화하여 보는것은 가능하다는 의미가 됩니다!
- 때문에 민감한 정보(개인정보, 비밀번호 등)는 담지 않도록 해야합니다.
- jsonwebtoken 실무에서는 배포 금지!! > 사이트 털린다~
회원 정보 > sign > 토큰
토큰 > verify > 회원 정보
const jwt = require('jsonwebtoken');
const user = {
name : "우준호",
id: "noggong",
}
const 임시출입증 = jwt.sign(user, "xxxxxx")
console.log("임시출입증 : ", 임시출입증)
const 입장하려는사람의정보 = jwt.verify(임시출입증, "xxxxxx")
User.find(입장하려는사람의정보.id)
console.log("입장하려는사람의정보:", 입장하려는사람의정보)
//JWT를 적용한 로그인 API
const express = require('express');
const JWT = require("jsonwebtoken");
const app = express();
app.post('/login', async (req, res) => {
// 사용자 정보
const user = {
userId: 203,
email: "archepro84@gmail.com",
name: "이용우",
}
// 사용자 정보를 JWT로 생성
const userJWT = await JWT.sign(user, // user 변수의 데이터를 payload에 할당
"secretOrPrivateKey", // JWT의 비밀키를 secretOrPrivateKey라는 문자열로 할당
{ expiresIn: "1h" } // JWT의 인증 만료시간을 1시간으로 설정
);
// userJWT 변수를 sparta 라는 이름을 가진 쿠키에 Bearer 토큰 형식으로 할당
res.cookie('sparta', `Bearer ${userJWT}`);
return res.status(200).end();
});
app.listen(5002, () => {
console.log(5002, "번호로 서버가 켜졌어요!");
});
출처 : 스파르타 코딩클럽 내일 배움 캠프 노드 숙련 강의 자료
튜터 님