Node.js에서 웹 인증 보안은 사용자가 안전하게 인증되고 권한이 부여된 상태에서 웹 애플리케이션을 사용할 수 있도록 하는 핵심 기능입니다. 이번 글에서는 웹 인증에서 많이 사용되는 쿠키, 세션, 그리고 토큰의 개념과 각각의 장단점을 이해하기 쉽게 설명해 보겠습니다.
쿠키는 클라이언트의 브라우저에 저장되는 작은 데이터입니다. 서버는 클라이언트가 방문할 때마다 HTTP 응답에 Set-Cookie
헤더를 추가하여 브라우저에 쿠키를 설정할 수 있습니다. 이후 클라이언트가 요청을 보낼 때 쿠키는 자동으로 HTTP 요청에 포함되어 전송됩니다.
res.cookie('sessionId', 'abcd1234', { httpOnly: true, secure: true });
httpOnly
: JavaScript로 접근 불가능하게 하여 보안을 강화합니다.secure
: HTTPS 연결에서만 쿠키가 전송되도록 합니다.세션은 서버 측에 사용자 정보를 저장하는 방식입니다. 사용자가 로그인하면 서버는 세션을 생성하고, 해당 세션의 ID를 쿠키로 클라이언트에게 전달합니다. 이후 사용자가 요청할 때 이 세션 ID를 통해 서버는 해당 사용자를 식별할 수 있습니다.
세션 흐름:
코드 예시 (Express-session 사용):
const session = require('express-session');
app.use(session({
secret: 'mySecret',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}));
secret
: 세션을 암호화하기 위한 키입니다.cookie.secure
: HTTPS 환경에서만 세션 쿠키를 설정하도록 보장합니다.토큰 기반 인증은 서버가 사용자를 인증한 후 토큰을 발급하는 방식입니다. 이 토큰에는 사용자의 정보와 서명이 포함되며, 클라이언트는 이후 요청 시 이 토큰을 포함하여 서버로 전송해 자신의 신원을 인증합니다. 가장 많이 사용되는 방식은 JWT (JSON Web Token)입니다.
JWT 구조: JWT는 헤더(Header)
, 페이로드(Payload)
, 서명(Signature)
으로 구성됩니다.
코드 예시 (jsonwebtoken 라이브러리 사용):
const jwt = require('jsonwebtoken');
const token = jwt.sign({ userId: 1234 }, 'mySecretKey', { expiresIn: '1h' });
expiresIn
: 토큰의 유효 기간을 설정합니다.항목 | 쿠키 | 세션 | 토큰 (JWT) |
---|---|---|---|
저장 위치 | 클라이언트(브라우저) | 서버 | 클라이언트(브라우저) |
데이터 보관 방식 | 키-값 쌍 | 서버 측 세션 ID로 사용자 식별 | 자체적으로 사용자 정보 포함 |
확장성 | 높음 | 낮음 | 매우 높음 |
보안성 | 보안 설정에 따라 다름 | 상대적으로 안전 | 서명 기반으로 신뢰 가능 |
주 사용처 | 사용자 설정 유지, 인증 | 로그인 및 사용자 상태 유지 | RESTful API 인증 |
Node.js에서의 웹 인증 보안은 쿠키, 세션, 그리고 토큰 세 가지 방식을 사용하여 구현할 수 있습니다. 각각의 방식은 상황에 따라 다르게 적용될 수 있으며, 특정 시나리오에 더 적합한 방식이 존재합니다. 예를 들어, 단순한 로그인 상태 유지에는 세션이 적합할 수 있지만, 확장성과 서버 부담을 고려해야 하는 경우에는 JWT와 같은 토큰 기반 인증이 더 효율적입니다.