본문 바로가기

Programing/Node.js

[node] http 모듈과 express에서 헤더

RFC 스펙에서 HTTP 헤더의 이름은 대소문자를 구별하지 않는 것으로 되어 있다.

따라서 특정 헤더의 값을 가져올 때 구현체에 따라 주의를 기울여야 한다.
에를 들어 node.js의 http 모듈에서는 내부적으로 소문자로 바꾸어서 저장을 한다.

심지어 클라이언트가 대문자를 넣어서 보낸 경우에도 소문자로 저장을 한다.

만약 시스템간 Correlation ID의 연동을 위해 헤더에 X-Trace-Id 라는 값을 넣기도 한다.
만약 headers['X-Trace-Id']으로 조회를 했다면 undefined 를 얻을 가능성이 있다.

express에서 내부적으로 node의 http 모듈을 사용하고 있기에 동일하다.
만약 request 객체의 headers를 이용한다면 아래와 같이 모든 소문자로 조회를 해야 한다.

const xTraceId = req.headers['x-trace-id'];

하지만 express에서는 header라는 메서드를 제공하고 있는데 이 메서드의 경우 내부적으로 lower로 바꾸는 코드가 있기에 이런 변환을 라이브러리가 대신 해준다.

// express request.js
req.get =
req.header = function header(name) {
  if (!name) {
    throw new TypeError('name argument is required to req.get');
  }

  if (typeof name !== 'string') {
    throw new TypeError('name must be a string to req.get');
  }

  var lc = name.toLowerCase();

  switch (lc) {
    case 'referer':
    case 'referrer':
      return this.headers.referrer
        || this.headers.referer;
    default:
      return this.headers[lc];
  }
};

따라서 아래와 같이 사용하는 것이 가능하다.

const xTraceId = req.header('X-Trace-Id');