본문 바로가기

Sparta/TIL

24.01.29 TIL - 세션, JWT

1. 쿠키와 세션

쿠키(Cookie)란 사용자가 웹사이트를 방문할 때마다 이전에 방문했던 정보를 기억하는 데이터파일.
브라우저가 서버로부터 응답으로 Set-Cookie 헤더를 받은 경우 해당 데이터를 저장한 뒤 모든 요청에 포함하여 보낸다.
데이터를 여러사이트에 공유할 수 있기 때문에 보안에 취약할 수 있다. 그리고 문자열 형식으로 존재하며, 쿠키 간에는 세미콜론(;)으로 구분된다.

 

세션(Session)쿠키를 기반으로 구성된 기술로, 세션 id를 쿠키를 이용해 클라이언트에게 전달하여, 서버는 이 세션 id를 사용해 저장된 세션 데이터를 조회한다.
쿠키와 마찬가지로 만료기간이 있다는 점은 비슷하지만, 클라이언트가 마음대로 데이터를 확인할 수 있는 쿠키와는 다르게 세션은 서버에만 저장.
세션을 통해 사용자의 상태정보를 서버에 저장하면, 서버는 사용자의 상태를 추척할 수 있다.
보안성은 좋으나 반대로 사용자가 많은 경우 서버에 저장해야 할 데이터가 많아져서 서버의 크기가 커야함.

 

- set-session 예시

let session = {};
app.get('/set-session', function (req, res, next) {
  // 현재는 sparta라는 이름으로 저장하지만, 나중에는 복잡한 사용자의 정보로 변경될 수 있습니다.
  const name = 'sparta';
  const uniqueInt = Date.now();
  // 세션에 사용자의 시간 정보 저장
  session[uniqueInt] = { name };

  res.cookie('sessionKey', uniqueInt);
  return res.status(200).end();
});

 

세션이라는 변수를 만들고 app.get의 내부에서 실제 변수를 저장하게 됨.

name에다가 sparta라는 값을 넣었고, uniqueInt에서 현재시간정보를 키값으로 사용하기 위한 Date.now()로 정의했다.

세션이라는 객체에다가 uniqueInt라는 세션에 고유한 정보를 바탕으로 키를 작성하게 되고 밸류에 name이라는 객체를 할당하게 된다. 여기서 네임은 위의 sparta라는 값이 들어있다.

그래서 서버는 쿠키를 발급할 때 sessionKey라는 이름으로 발급할 건데, 키 안에는 uniqueInt 라는 실제 세션을 조회할 수 있는 정보가 반환된다. 나중에 클라이언트가 세션키라는 쿠키를 uniqueInt 라는 벨류를 가진 상태로 서버에 전달하면 서버는 세션키라는 것을 받아 uniqueInt 라는 정보를 바탕으로 세션에 있는 데이터를 조회하게 된다.

 

이것을 get-session으로 볼 수 있다.

app.get('/get-session', function (req, res, next) {
  const { sessionKey } = req.cookies;
  // 클라이언트의 쿠키에 저장된 세션키로 서버의 세션 정보를 조회합니다.
  const name = session[sessionKey];
  return res.status(200).json({ name });
});

 

 

2. JWT

JWT(Json Web Token)은 웹 표준으로써, 서버와 클라이언트 사이에서 정보를 안전하게 전송하기 위해 도움을 주는 웹토큰이다.

 

1) 특징

i) JSON 형태의 데이터를 안전하게 전송하고 검증할 수 있는 기능을 제공합니다.

ii) 인터넷 표준으로서 자리잡은 규격입니다.

iii) 다양한 암호화 알고리즘을 사용할 수 있어, 신뢰성을 보장합니다.

iv) header.payload.signature 의 형식으로 3가지의 데이터를 포함합니다. -> 항상 . 이 두개 포함된 데이터

 

2) 형태 : JWT의 구조는 크게 헤더(Header), 페이로드(Payload), 서명(Signature)의 구조로 되어있다.

a) header : 토큰의 타입과 어떤 암호화를 사용하여 생성된 데이터인지 정의되어 있다.

{
  "alg": "HS256",
  "typ": "JWT"
}

 

b) payload : 실제 전달하려는 데이터를 담고 있다. 개발자가 원하는 데이터를 저장한다.

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

 

c) signature : 헤어와 페이로드 그리고 비밀키(Secret Key)를 이용하여 생성. 이것이 토큰이 변조되지 않은 정상적인 토큰인지 확인할 수 있게 도와준다.

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
	secret
)

 

각 부분을 Base64로 인코딩하여 점(.)으로 연결하면 최종적으로 JWT를 생성하게 된다. 그리고 이 JWT가 쿠키나 경로 매개변수(Path parameter)를 통해 전달될 수 있다.

'Sparta > TIL' 카테고리의 다른 글

24.01.31 TIL - log, transaction  (0) 2024.02.01
24.01.30 TIL - tables  (1) 2024.01.31
23.01.26 TIL - Prisma(1)  (0) 2024.01.29
24.01.25 TIL - SQL(2)  (0) 2024.01.25
24.01.24 TIL - MySQL(1)  (1) 2024.01.24