Cookie, Session, Token

원도훈·2024년 11월 15일
1
post-thumbnail

Node.js에서 웹 인증 보안은 사용자가 안전하게 인증되고 권한이 부여된 상태에서 웹 애플리케이션을 사용할 수 있도록 하는 핵심 기능입니다. 이번 글에서는 웹 인증에서 많이 사용되는 쿠키, 세션, 그리고 토큰의 개념과 각각의 장단점을 이해하기 쉽게 설명해 보겠습니다.

쿠키, 세션, 토큰이란?

  • 쿠키 (Cookie): 클라이언트의 브라우저에 저장되는 작은 데이터 조각입니다. 웹 서버가 클라이언트에게 보내며, 이후 클라이언트가 서버와 상호작용할 때 이 데이터를 다시 보냅니다. 일반적으로 사용자의 로그인 정보를 기억하거나 세션 ID를 저장하는 데 사용됩니다.
  • 세션 (Session): 서버에 저장되는 사용자 정보입니다. 사용자가 웹 애플리케이션을 방문할 때 서버는 세션을 생성하여 클라이언트를 식별합니다. 클라이언트는 세션 ID를 쿠키로 저장하여 서버에 요청할 때마다 전달합니다. 서버에서는 이 세션 ID를 통해 클라이언트의 상태를 추적합니다.
  • 토큰 (Token): 인증 정보가 포함된 작은 데이터 조각으로, 주로 JSON 형식으로 구성됩니다. 사용자가 로그인하면 서버는 JWT (JSON Web Token)와 같은 토큰을 발급하며, 사용자는 이후 요청에서 이 토큰을 사용하여 자신의 신원을 증명합니다.

쿠키의 개념과 사용 방법

쿠키는 클라이언트의 브라우저에 저장되는 작은 데이터입니다. 서버는 클라이언트가 방문할 때마다 HTTP 응답에 Set-Cookie 헤더를 추가하여 브라우저에 쿠키를 설정할 수 있습니다. 이후 클라이언트가 요청을 보낼 때 쿠키는 자동으로 HTTP 요청에 포함되어 전송됩니다.

  • 용도: 세션 ID 저장, 사용자 로그인 상태 유지, 사용자 맞춤형 설정 저장 등.
  • 코드 예시 (Express에서 쿠키 설정):
    res.cookie('sessionId', 'abcd1234', { httpOnly: true, secure: true });
    • httpOnly: JavaScript로 접근 불가능하게 하여 보안을 강화합니다.
    • secure: HTTPS 연결에서만 쿠키가 전송되도록 합니다.

쿠키의 장점과 단점

  • 장점: 서버의 부담이 적고, 간단한 데이터 저장에 용이합니다.
  • 단점: 클라이언트 측에 저장되기 때문에 보안에 취약할 수 있으며, 쿠키를 통해 개인정보가 노출될 위험이 있습니다.

세션 (Session)

세션의 개념과 사용 방법

세션은 서버 측에 사용자 정보를 저장하는 방식입니다. 사용자가 로그인하면 서버는 세션을 생성하고, 해당 세션의 ID를 쿠키로 클라이언트에게 전달합니다. 이후 사용자가 요청할 때 이 세션 ID를 통해 서버는 해당 사용자를 식별할 수 있습니다.

  • 세션 흐름:

    1. 사용자가 로그인 요청을 하면 서버는 세션 ID를 생성합니다.
    2. 생성된 세션 ID는 쿠키를 통해 클라이언트에 전달됩니다.
    3. 사용자가 이후 요청을 보낼 때, 세션 ID가 포함된 쿠키도 함께 전송되어 서버가 사용자를 식별합니다.
  • 코드 예시 (Express-session 사용):

    const session = require('express-session');
    
    app.use(session({
      secret: 'mySecret',
      resave: false,
      saveUninitialized: true,
      cookie: { secure: true }
    }));
    • secret: 세션을 암호화하기 위한 키입니다.
    • cookie.secure: HTTPS 환경에서만 세션 쿠키를 설정하도록 보장합니다.

세션의 장점과 단점

  • 장점: 데이터가 서버에 저장되기 때문에 클라이언트 측에서 데이터 조작 위험이 줄어듭니다.
  • 단점: 서버에 상태 정보를 저장하기 때문에 서버 자원이 많이 소모되며, 특히 대규모 트래픽을 처리할 때 확장성이 떨어질 수 있습니다.

토큰 (Token)

토큰의 개념과 사용 방법

토큰 기반 인증은 서버가 사용자를 인증한 후 토큰을 발급하는 방식입니다. 이 토큰에는 사용자의 정보와 서명이 포함되며, 클라이언트는 이후 요청 시 이 토큰을 포함하여 서버로 전송해 자신의 신원을 인증합니다. 가장 많이 사용되는 방식은 JWT (JSON Web Token)입니다.

  • JWT 구조: JWT는 헤더(Header), 페이로드(Payload), 서명(Signature)으로 구성됩니다.

    • 헤더: 토큰의 타입(JWT)과 해싱 알고리즘(예: HS256)을 포함합니다.
    • 페이로드: 사용자 정보와 같은 클레임을 포함합니다.
    • 서명: 헤더와 페이로드를 비밀 키로 해싱하여 생성합니다.
  • 코드 예시 (jsonwebtoken 라이브러리 사용):

    const jwt = require('jsonwebtoken');
    
    const token = jwt.sign({ userId: 1234 }, 'mySecretKey', { expiresIn: '1h' });
    • expiresIn: 토큰의 유효 기간을 설정합니다.

토큰의 장점과 단점

  • 장점:
    • 서버는 상태를 유지하지 않으므로 확장성(Scalability)이 좋습니다. 즉, 서버는 클라이언트의 상태를 기억할 필요가 없습니다.
    • RESTful API와 잘 어울리며, 클라이언트와 서버가 분리된 애플리케이션에 적합합니다.
  • 단점:
    • 발급된 토큰은 유효 기간이 만료되기 전까지는 취소할 수 없기 때문에, 보안 문제가 발생했을 때 취소가 어려울 수 있습니다.
    • 토큰이 노출되면, 해당 유효 기간 동안 악용될 가능성이 있습니다.

쿠키, 세션, 토큰의 비교

항목쿠키세션토큰 (JWT)
저장 위치클라이언트(브라우저)서버클라이언트(브라우저)
데이터 보관 방식키-값 쌍서버 측 세션 ID로 사용자 식별자체적으로 사용자 정보 포함
확장성높음낮음매우 높음
보안성보안 설정에 따라 다름상대적으로 안전서명 기반으로 신뢰 가능
주 사용처사용자 설정 유지, 인증로그인 및 사용자 상태 유지RESTful API 인증

Node.js에서의 웹 인증 보안은 쿠키, 세션, 그리고 토큰 세 가지 방식을 사용하여 구현할 수 있습니다. 각각의 방식은 상황에 따라 다르게 적용될 수 있으며, 특정 시나리오에 더 적합한 방식이 존재합니다. 예를 들어, 단순한 로그인 상태 유지에는 세션이 적합할 수 있지만, 확장성서버 부담을 고려해야 하는 경우에는 JWT와 같은 토큰 기반 인증이 더 효율적입니다.

profile
개발

0개의 댓글