클라이언트가 서버로 보내는 모든 정보는 Request 객체(req) 하나에 담긴다. URL 파라미터, 쿼리 스트링, 요청 본문, 헤더까지 — 어디서 꺼내야 하는지 알면 라우트 로직이 단순해진다. Express는 Node.js의 http.IncomingMessage를 확장해 이 데이터들을 편리한 속성으로 노출한다.
Client Request
│
▼
┌─────────────────────────────┐
│ req.method req.url │
│ req.headers req.ip │
│ req.params req.query │
│ req.body req.cookies │
└─────────────────────────────┘
│
▼
Router → Middleware → Controller
req.params 는 라우트 경로에 선언한 :변수를 담는다. req.query 는 ?key=value 형태의 쿼리 스트링을 파싱한 객체다.
// GET /users/42?verbose=true
app.get('/users/:id', (req, res) => {
const id = req.params.id; // "42"
const verbose = req.query.verbose; // "true"
res.json({ id, verbose });
});
req.params — 경로 세그먼트에서 추출된 동적 값. 항상 문자열 타입.
쿼리 파라미터가 여러 개일 때는 배열로도 전달될 수 있으므로, 타입 검증을 거치는 것이 안전하다.
req.body 는 POST/PUT 요청의 본문 데이터를 담는다. 단, 기본 Express에는 본문 파서가 없어 Middleware를 먼저 등록해야 한다.
import express from 'express';
const app = express();
app.use(express.json()); // JSON 본문 파싱
app.use(express.urlencoded({ extended: true })); // 폼 데이터 파싱
app.post('/users', (req, res) => {
const { name, email } = req.body;
res.status(201).json({ name, email });
});
express.json — Content-Type: application/json 헤더가 있는 요청의 본문을 파싱하는 내장 Middleware.
| 속성 | 설명 | 예시 |
|---|---|---|
req.headers | 모든 요청 헤더 객체 | { authorization: 'Bearer ...' } |
req.method | HTTP 메서드 | "GET", "POST" |
req.url | 경로 + 쿼리 스트링 | "/users?page=1" |
req.originalUrl | 마운트 경로 포함 전체 URL | "/api/v1/users?page=1" |
req.ip | 클라이언트 IP 주소 | "192.168.1.1" |
특정 헤더는 req.get 헬퍼로 대소문자 구분 없이 읽을 수 있다.
app.use((req, res, next) => {
const token = req.get('Authorization'); // 'authorization'도 동일
const contentType = req.get('Content-Type');
next();
});
req.cookies 를 사용하려면 cookie-parser Middleware가 필요하다.
import cookieParser from 'cookie-parser';
app.use(cookieParser());
app.get('/profile', (req, res) => {
const sessionId = req.cookies.sessionId;
res.json({ sessionId });
});
cookie-parser — 요청 헤더의 Cookie 문자열을 파싱해 req.cookies 객체로 만들어주는 서드파티 Middleware.
/products/:category?sort=price body: { name: "widget" }
│ │ │
req.params req.query req.body
(경로 식별자) (필터/옵션) (생성/수정 데이터)
리소스를 식별할 때는 req.params, 결과를 필터링·정렬할 때는 req.query, 데이터를 생성·수정할 때는 req.body에 담는 것이 REST 관례다.