컨텍스트 전파(Context Propagation) — 분산 트레이싱을 여는 열쇠
컨텍스트 전파(Context Propagation) — 분산 트레이싱을 여는 열쇠
컨텍스트 전파는 트레이스·메트릭·로그 같은 신호들이 어디서 생성됐든 서로 연관될 수 있게 해주는 개념이에요. 특히 트레이싱에 국한되지 않으면서도, 트레이스가 서비스 경계를 넘어 인과 관계(causal) 정보를 쌓을 수 있게 만드는 핵심이에요. 컨텍스트 전파를 이해하려면 **Context(컨텍스트)**와 **Propagation(전파)**이라는 두 개의 별개 개념을 알아야 해요.
출처: https://opentelemetry.io/docs/concepts/context-propagation/
본문
컨텍스트(Context)
컨텍스트는 신호 하나를 다른 신호와 연관 지을 수 있도록, 송신·수신 서비스(또는 실행 단위)에게 필요한 정보를 담는 객체예요. 예를 들어 서비스 A가 서비스 B를 호출할 때, A는 컨텍스트의 일부로 trace ID와 span ID를 실어 보내요. 서비스 B는 이 값들을 사용해 같은 트레이스에 속하는 새 스팬을 만들고, 서비스 A의 스팬을 부모로 삼아요. 이렇게 해서 서비스 경계를 가로지르는 요청의 전체 흐름을 추적할 수 있게 돼요.
전파(Propagation)
전파는 컨텍스트를 서비스·프로세스 사이로 옮기는 메커니즘이에요. 컨텍스트 객체를 직렬화·역직렬화해서 한 서비스에서 다른 서비스로 전달할 정보를 제공하죠. 전파는 보통 계측 라이브러리가 처리해 사용자에게는 투명하게 동작해요. 수동으로 컨텍스트를 전파해야 한다면 Propagators API를 사용할 수 있어요.
OpenTelemetry는 여러 공식 propagator를 유지하며, 기본 propagator는 W3C TraceContext 스펙이 정의한 헤더를 사용해요.
예시: traceparent 헤더
Product Catalog 서비스에서 Frontend에서 온 요청의 활동을 이해할 때, 컨텍스트(여기서는 Trace ID와 Span ID가 'Parent ID'로)는 W3C TraceContext 스펙의 traceparent 헤더로 전파돼요. ID는 헤더의 필드에 이렇게 들어가요.
<version>-<trace-id>-<parent-id>-<trace-flags>
예: 00-a0892f3577b34da6a3ce929d0e0e4736-f03067aa0ba902b7-01
- 트레이스: 전파 덕분에 서로 다른 서비스의 스팬들이 하나의 트레이스로 조립돼요.
traceparent헤더에서 원격 컨텍스트를 추출해 로컬 컨텍스트에 주입하면, 백엔드(예: Jaeger)에서 두 요청을 하나의 트레이스 스팬으로 볼 수 있어요. - 로그: SDK가 로그에 Trace ID·Span ID를 주입해 로그를 트레이스·스팬 컨텍스트에 자동으로 연관 지어요.
- 메트릭: 컨텍스트 전파는 해당 컨텍스트 안에서 측정값을 집계할 수 있게 해줘요. 예를 들어 모든
GET /product요청의 응답 시간뿐 아니라,POST /cart/add > GET /product같은 조합별 메트릭도 얻을 수 있어요.
직접 컨텍스트 전파(Custom Context Propagation)
대부분의 경우 계측 라이브러리가 컨텍스트 전파를 처리해줘요. 하지만 지원이 없는 경우 Propagators API로 직접 만들 수 있어요.
- 송신 측: 컨텍스트를 carrier(예: HTTP 요청 헤더)에 **inject(주입)**해요.
- 수신 측: carrier에서 컨텍스트를 **extract(추출)**해요. HTTP라면 헤더에서 가져오고, 그 외에는 송신 측에서 고른 저장 위치에서 꺼내요.
메타데이터 전용 필드가 없는 프로토콜에도 전파가 가능하지만, 수신 측에서 데이터를 처리하기 전에 추출·제거해야 해요. 그렇지 않으면 정의되지 않은 동작이 생길 수 있으니 주의해야 해요.
보안 모범 사례
- 들어오는 컨텍스트(Incoming): 외부 소스의 컨텍스트를 받을 때는 주의해야 해요. 악의적인 사용자가 위조된 trace 헤더를 보내 트레이싱 데이터를 조작하거나 파싱 취약점을 노릴 수 있어요. 신뢰할 수 없는 소스의 컨텍스트는 무시하거나 정화(sanitize)하는 걸 고려해요.
- 나가는 컨텍스트(Outgoing): 외부 서비스로 무엇을 전파할지 신중해야 해요. 내부 trace ID·span ID·배기지 항목이 내부 아키텍처나 비즈니스 로직을 드러낼 수 있어요.
- 배기지(Baggage): 사용자 자격증명, API 키, PII 같은 민감 정보를 배기지에 넣지 마세요. 서비스 경계를 넘어 전파되므로 로그에 남거나 신뢰할 수 없는 다운스트림으로 전송될 수 있어요.
더 알아보기
- Propagators API: 직접 전파를 위한 주입·추출 인터페이스
- W3C TraceContext: 기본 propagator가 사용하는 표준 헤더 스펙
- 배기지(Baggage): 서비스 경계를 넘어 임의 키-값을 전파하는 메커니즘
- 스펙: 더 자세한 내용은 OpenTelemetry Context 스펙 참고