Notice
Recent Posts
Recent Comments
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Día de Ruru

20230303 TIL (Node.js 기초 공부 day3) 본문

항해99/TIL

20230303 TIL (Node.js 기초 공부 day3)

공대루루 2023. 3. 4. 11:20

☆오늘 알게 된 것★


쿠키와 세션

쿠키🍪 : 서버에서 Set-Cookie로 브라우저로 쿠키를 보내면 브라우저는 해당 데이터를 저장한 뒤 서버에 request를 할때마다 갖고 있는 쿠키 데이터를 포함시켜서 보낸다. 쿠키는 데이터를 여러 사이트에 공유할 수 있기 때문에 보안에 취약하며 보통 상태를 저장하기 위해서 사용한다.

서버가 클라이언트의 request를 받을 때, response와 함께 Set-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();
});

cookie-parser를 사용하면 req.cookie로 바로 쿠키 데이터를 받을 수 있으며 자동으로 객체 형태로 불러오게 된다.

세션🔐  : 쿠키를 기반으로 구성된 기술이지만 클라이언트가 마음대로 데이터를 확인 할 수 있던 쿠키와는 다르게 고유한 세션 ID를 이용해 세션 데이터에 접근할 수 있기 때문에 쿠키의 단점을 보완해준다. 하지만 사용자가 많은 경우 서버에 저장해야 할 데이터가 많아져서 서버 컴퓨터가 감당하지 못하는 문제가 생기기 쉽다.


JWT

데이터를 교환하고 관리하는 방식인 쿠키/세션과 달리 JWT는 단순히 데이터를 표현하는 방식이다.  JWT는 유저를 인증하고 식별하기 위한 토큰 기반의 인증이며 세션과는 달리 서버가 아닌 클라이언트에 저장되기 때문에 서버의 부담이 줄어든다. JWT는 일반적으로 아래와 같은 순서로 사용된다,

  1. 클라이언트가 아이디와 패스워드를 통해 로그인 인증을 한다.
  2. 서버에서 JWT를 생성해서 response해준다.
  3. 클라이언트가 서버에 데이터를 추가적으로 요구할 때 JWT를 첨부해서 함께 보낸다.
  4. 서버에서 JWT를 검증하여 사용자가 맞는지 확인하고 다음 동작을 실행한다.

예를 들어 쇼핑몰에 로그인을 한 후 장바구니에 들어가려고 하면(데이터를 추가적으로 요구) 서버에서 JWT를 검증한 후, 해당 사용자의 장바구니 데이터를 전달해주는 방식으로 동작한다.

JWT는 header.payload.signature의 형식으로 3가지의 데이터를 포함한다. 개발자가 원하는 데이터를 paload에 들어있으며 signature를 통해서 토큰이 변조되지 않았는지 확인할 수 있다. signature가 다르면 payload 에 있는 데이터를 조회가 가능하지만(누구나 Decode가 가능하다) 내용의 변조를 불가능 하다. 아래와 같이 생성할 수 있다.

const JWT = require("jsonwebtoken");

const userJWT = JWT.sign(user,   // user 변수의 데이터를 payload에 할당
    "secretOrPrivateKey",   // JWT의 비밀키를 secretOrPrivateKey라는 문자열로 할당
    { expiresIn: "1h" }    // JWT의 인증 만료시간을 1시간으로 설정
);

JWT가 변조되지 않은 데이터인지 검증한 후 사용해야 한다. 만약 변조된 데이터라면 jwt.verify 에서 에러가 발생한다.

const jwt = require("jsonwebtoken");

const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2Njc1NjE0NDB9.nvYSsLsT8jp7IfkbB2seCNeuLqRBgrrzDjKRFXjvoUE";
const decodedValueByVerify = jwt.verify(token, "mysecretkey");

console.log(decodedValueByVerify);

'항해99 > TIL' 카테고리의 다른 글

20230306 TIL  (0) 2023.03.07
20230304 TIL (Node.js 기초 공부 day4)  (0) 2023.03.05
20230301 TIL  (0) 2023.03.01
20230228 TIL  (0) 2023.03.01
20230227 TIL  (0) 2023.02.28
Comments