JSON Web Token + Cookie (수정 24/09/17)

Hunter Joe·2024년 8월 16일
post-thumbnail

수정일 - 24/09/17

일반적인 회원인증 기능의 동작 방식


A라는 웹 사이트의 컨텐츠를 로그인한 사람만 사용 가능하게 설정

  • session 방식
  • token 방식
  1. Client 로그인
  2. 웹 사이트는 토큰 발급
  3. 컨텐츠를 이용할 때마다 웹 사이트에서 입장권(토큰) 확인

JWT


JWT란 Client <-> Website(Server) 간에 정보를 JSON 개체로 안전하게 전송하기 위한 개방형 표준(RFC-7519)
JWT 방식을 이용하게 되면 Stateless 하다

  • Stateless 인증 : 서버가 세션 상태를 관리하지 않고, 사용자의 인증 정보를 토큰에 담아 클라이언트에게 전달하며, 각 요청마다 토큰을 검증하여 사용자를 인증하는 방식
  • 사용자가 많을수록 처리가 빨라짐
  • 인증에 필요한 정보들을 Token에 담아 암호화시켜 사용하는 토큰
  • pub/pvt 키를 쌍으로 사용해 토큰에 서명할 경우, 서명된 토큰은 개인 키를 보유한 서버가 이 서명된 토큰이 정상적인 토큰인지 인증할 수 있다.

JWT 구조


  • Header
  • Payload
  • Signature


  • 일반적으로 Token의 타입, 서명 생성에 쓰인 알고리즘이 저장

Payload


  • 토큰에 포함될 Claim 정보를 담음 (3가지)
    - 등록된 클레임(Registerd Claims): 표준적인 클레임으로, 일반적으로 토근에 포함되는 정보

    Ex) "iss:(발급자), "exp"(만료시간), "sub"(주체) 등이 있다.


    - 공개 클레임 (Public Claims): 사용자 정의 클레임으로, 충돌을 피하기 위해 이름공간을 정의하는데 사용됩니다. 예를 들어, "username"이나 "email" 등의 사용자 정보가 여기에 들어갈 수 있습니다.

    -개인 클레임 (Private Claims): 서로 협의한 클레임으로, 서버와 클라이언트 간에 사용되는 사용자 정의 클레임입니다.

Signature


  • 서명은 Header와 Payload를 서버에서 발급한 비밀 키를 사용하여 서명한 값
  • 서버는 Header와 Payload를 합쳐서 문자열로 만든 다음, 해당 문자열을 서명 알고리즘에 따라 서명
  • 서명을 검증하려면 클라이언트 또는 다른 서버는 동일한 알고리즘과 비밀 키를 사용하여 서버에서 생성한 서명과 일치하는지 확인 → 이를 통해 토큰의 무결성이 검증

use case (추가:24/09/17)

import jwt from "jsonwebtoken";

export const generateTokenAndSetCookie = (userId, res) => {
  const token = jwt.sign({userId}, process.env.JWT_SECRET, {
    expiresIn: "7d",
  });

  res.cookie("jwt", token, {
    maxAge: 7 * 24 * 60 * 60 * 1000, // ms
    httpOnly: true, // XSS attack
    sameSite: "strict",
    secure: process.env.NODE_ENV !== "development", 
  });
};

generateTokenAndSetCookie : 토큰 + 쿠키 발행

jwt.sign(): 이 함수를 통해 생성된 토큰은 userId의 정보를 담음
-> 이 토큰으로 서버 <-> 클라이언트 간 인증을 위한 정보로 사용

JWT_SECRET : git bash 터미널에 openssl rand -base64 32 입력
-> 32바이트 길이의 랜덤 문자열을 base64로 인코딩해서 출력해줌 (랜덤 값 만들기)

res.cookie(): 클라이언트의 브라우저에 저장되는 데이터 조각
인증 토큰(token)을 쿠키에 저장해 웹 사이트의 다른 페이지를 오갈 수 있는 통행증 역할을 함

work flow diagram

profile
Improvise, Adapt, Overcome

0개의 댓글