본문 바로가기

학습 내용 정리/기본

쿠키와 세션, JWT

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, "번호로 서버가 켜졌어요!");
});

 

 

 

출처 : 스파르타 코딩클럽 내일 배움 캠프 노드 숙련 강의 자료

튜터 님

'학습 내용 정리 > 기본' 카테고리의 다른 글

VS Code 단축키  (0) 2023.08.03
터미널 명령어  (0) 2023.06.24
데이터베이스란?  (0) 2023.06.18
요청과 응답  (0) 2023.06.17
프론트 엔드 백엔드란?  (0) 2023.06.17