Express 5.0.0: 새로운 기능 및 업데이트
Grace Collins
Solutions Engineer · Leapcell

Express.js 5.0.0 릴리스: 안정성 및 보안 개선
Express.js는 Node.js 애플리케이션 개발을 위한 매우 인기 있는 웹 애플리케이션 프레임워크로, 항상 개발자들의 주목을 받아왔습니다. 최근 Express.js 팀은 공식적으로 버전 5.0.0을 출시했습니다. 2014년 첫 번째 주요 버전 출시 이후 만 10년이 지났습니다. 이 긴 기간 동안 Express.js는 수많은 반복과 최적화를 거쳤으며, 버전 5.0.0은 새로운 기능과 개선 사항을 제공하여 개발자에게 색다른 경험을 선사합니다.
I. 버전 릴리스 개요
Express.js 5.0.0 릴리스는 안정성과 보안이라는 두 가지 핵심 목표에 중점을 둡니다. 개발자가 더욱 강력한 Node.js 애플리케이션을 구축하도록 지원하고 현대적인 웹 개발을 위한 더욱 견고한 기반을 제공하는 것을 목표로 합니다. 오늘날 빠르게 진화하는 기술 환경에서 애플리케이션의 안정성과 보안은 사용자 경험 및 데이터 보안과 직접적인 관련이 있습니다. 따라서 Express.js 팀의 이러한 움직임은 특히 중요합니다.
II. Node.js 버전 지원 변경 사항
Express 5는 구형 Node.js 버전에 대한 지원을 단호하게 중단했습니다. 릴리스 노트에 따르면 이 버전은 v18 이전의 Node.js 버전을 더 이상 지원하지 않습니다. 이 변경 사항은 간단해 보일 수 있지만 광범위한 영향을 미칩니다. 구형 Node.js 버전을 지원하는 것은 어느 정도 Express.js의 성능 및 유지 관리 측면에서 주요 개선 사항을 제한했습니다. 예를 들어 구형 Node.js 버전은 일부 성능 병목 현상이 있을 수 있으며 새로운 하드웨어 기능 및 최적화 알고리즘을 완전히 활용할 수 없어 동시성이 높은 시나리오에서 Express 애플리케이션의 성능이 저하될 수 있습니다. 구형 버전에 대한 지원을 중단하면 지속적인 통합(CI)이 더욱 안정적이고 유지 관리하기 쉬워질 뿐만 아니라 Express.js가 새로운 언어 및 새로운 런타임의 기능을 더 잘 수용할 수 있습니다. 동시에 불필요한 종속성을 제거하여 로드를 줄이고 전체 성능을 향상시킬 수 있습니다.
III. 보안 관련 개선 사항
(I) 경로 라우팅 매칭 수정
종합적인 보안 감사를 거친 후 Express.js 팀은 경로 라우팅 매칭 방식에 대한 주요 수정 사항을 적용했습니다. 정규식 서비스 거부(ReDoS) 공격을 효과적으로 방어하기 위해 Express 5는 더 이상 정규식에서 하위 표현식(예: /app.get('/:id(\d+)', (req, res) => res.send(\'ID: ${req.params.id}\'));
와 같은 코드를 사용하여 특정 형식의 경로 매개변수를 매칭할 수 있었습니다. 그러나 Express 5에서는 이 방법이 더 이상 허용되지 않습니다.
Express.JS 기술 위원회 위원인 Blake Embrey는 정규식 예제(예: /^/flights/([^/]+?)-([^/]+?)/?$/i
)를 제공했습니다. /flights/
+ '-'.repeat (16_000)
+ /x
와 매칭할 때 실제로 300밀리초가 걸렸지만 정상적인 상황에서는 1밀리초 미만이어야 했습니다. 이처럼 엄청난 시간 차이는 특정 상황에서 정규식의 잠재적인 성능 위험을 완전히 입증하며, 이는 Express 5의 개선 사항에 대한 중요한 이유이기도 합니다. 애플리케이션의 보안을 보장하기 위해 Express 팀은 개발자가 joi와 같은 강력한 입력 유효성 검사 라이브러리를 사용하여 입력 데이터를 엄격하게 검증하고 소스에서 악의적인 공격을 방지할 것을 권장합니다.
(II) 정규식 와일드카드에 대한 요구 사항
Express 5는 또한 정규식의 와일드카드에 대한 명확한 요구 사항을 제시합니다. 와일드카드는 명시적으로 이름을 지정하거나 (.)**로 대체해야 합니다. 이렇게 하면 경로 매칭의 명확성과 예측 가능성이 향상됩니다. 예를 들어 Express 5에서 /foo
와 같은 경로는 /foo (.)
로 업데이트해야 합니다. 이렇게 하면 경로 매칭을 수행할 때 개발자가 매칭 규칙을 더 명확하게 이해하고 불명확한 규칙으로 인해 발생할 수 있는 잠재적인 문제를 방지할 수 있습니다.
(III) 경로에서 선택적 매개변수의 구문 변경
경로에서 선택적 매개변수의 구문도 크게 변경되었습니다. Express 4에서는 :name?
가 선택적 매개변수를 나타내는 데 사용됩니다. 예를 들어 app.get('/user/:id?', (req, res) => res.send(req.params.id || 'No ID'));
와 같습니다. Express 5에서는 구문이 {/:name}
로 변경되었으며 해당 코드 예제는 app.get('/user{/:id}', (req, res) => res.send(req.params.id || 'No ID'));
입니다. 이 구문 변경으로 인해 개발자가 일부 코드 조정을 수행해야 하지만 경로 규칙을 더욱 직관적이고 이해하기 쉽게 만듭니다.
(IV) 정규 캡처 그룹 매개변수에 대한 액세스 변경
정규 캡처 그룹에서 이름이 지정되지 않은 매개변수는 더 이상 인덱스로 액세스할 수 없습니다. 이제 매개변수에 이름을 지정해야 합니다. Express 4에서는 app.get('/user(s?)', (req, res) => res.send(req.params[0]));
와 같은 코드를 사용하여 캡처 그룹에서 매개변수를 가져올 수 있었으며 여기서 's'
를 반환합니다. 그러나 Express 5에서는 app.get('/user:plural?', (req, res) => res.send(req.params.plural));
와 같이 이름이 지정된 매개변수가 필요합니다. 이 접근 방식은 색인 혼동으로 인한 오류를 방지하고 코드의 가독성과 유지 관리성을 향상시킬 수 있습니다.
(V) HTTP 상태 코드 유효성 검사
Express 5는 HTTP 상태 코드의 유효성 검사를 적용합니다. 이는 자동 오류를 방지하고 개발자가 어려운 디버깅 프로세스에 빠지지 않도록 하는 중요한 방어 메커니즘입니다. Express 4에서는 res.status(978).send('Invalid status');
와 같은 코드를 사용하여 유효하지 않은 상태 코드 978을 설정하더라도 오류를 보고하지 않고 자동으로 실패하여 개발자가 문제를 해결하는 데 큰 어려움을 겪습니다. Express 5에서는 동일한 코드가 직접 오류를 발생시켜 개발자가 문제를 적시에 발견하고 수정하도록 상기시켜 개발 효율성과 애플리케이션 안정성을 크게 향상시킵니다.
IV. 비동기 미들웨어 및 경로의 오류 처리 개선
Express.js 5는 비동기 미들웨어 및 경로에서 오류 처리를 더욱 간결하고 효율적으로 만듭니다. 거부된 Promise를 오류 처리 미들웨어로 자동으로 전달할 수 있는 비동기 미들웨어 및 경로의 오류 처리 메커니즘을 개선했습니다. 개발자는 더 이상 try/catch 블록을 수동으로 사용할 필요가 없습니다. Express 4에서 비동기 요청을 처리할 때 코드는 다음과 같을 수 있습니다.
app.get('/data', async (req, res, next) => { try { const result = await fetchData(); res.send(result); } catch (err) { next(err); } });
Express 5에서는 코드를 다음과 같이 단순화할 수 있습니다.
app.get('/data', async (req, res) => { const result = await fetchData(); res.send(result); });
이러한 개선 사항은 코드 양을 줄일 뿐만 아니라 코드 구조를 더욱 명확하게 하고 오류 발생 가능성을 줄입니다.
V. 업그레이드 권장 사항
Express 팀은 주요 변경 사항을 최소화하기 위해 모든 노력을 기울였지만 Express 코드를 새 버전으로 업그레이드하려는 개발자는 여전히 매우 신중해야 합니다. 업그레이드 프로세스 중에 위에서 언급한 구문 변경 및 Node.js 버전 요구 사항과 같은 다양한 호환성 문제가 발생할 수 있습니다. 따라서 개발자는 온라인 마이그레이션 가이드를 주의 깊게 검토하고 가이드의 단계에 따라 단계별로 업그레이드하여 애플리케이션의 원활한 전환을 보장해야 합니다.
OpenJS Foundation(At - Large 범주)의 중요한 프로젝트인 Express.js는 항상 Node.js 개발자를 위한 강력한 지원을 제공해 왔습니다. 개발자는 전체 릴리스 노트를 읽고 더 많은 기술 세부 사항과 예제를 심층적으로 이해하여 Express.js 5.0.0의 새로운 기능을 더 잘 활용하고 더 나은 Node.js 애플리케이션을 구축할 수 있습니다. Express.js 5.0.0의 도움으로 Node.js 애플리케이션 개발이 새로운 수준에 도달할 것이라고 믿어집니다.
Leapcell: 웹 호스팅을 위한 최고의 서버리스 플랫폼
마지막으로 Express 앱을 배포하는 데 가장 적합한 플랫폼인 Leapcell을 소개하고 싶습니다.
1. 다국어 지원
- JavaScript, Python, Go 또는 Rust로 개발하세요.
2. 무제한 프로젝트를 무료로 배포
- 사용량에 대해서만 비용을 지불하세요. 요청이나 요금이 없습니다.
3. 최고의 비용 효율성
- 유휴 요금 없이 사용한 만큼 지불하세요.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
4. 간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
5. 손쉬운 확장성 및 고성능
- 고도의 동시성을 쉽게 처리할 수 있는 자동 확장.
- 운영 오버헤드가 없으므로 구축에만 집중하세요.
Leapcell Twitter: https://x.com/LeapcellHQ