Categories: Camel프레임워크

[Camel in Action] 13-2. Camel Policy와 접근 제어 – 라우트 레벨 보안 구현

라우트 레벨 보안의 개념

Camel에서 보안은 두 가지 수준에서 적용할 수 있습니다. 첫째는 네트워크/전송 수준(SSL, VPN)이고, 둘째는 라우트 수준입니다. 라우트 수준에서는 누가 어떤 라우트를 실행할 수 있는지, 어떤 데이터에 접근할 수 있는지를 제어합니다.

RoutePolicy로 라우트 동작 제어

RoutePolicy는 라우트의 시작/중지/일시 정지를 제어하는 인터페이스입니다. 보안 정책을 이 인터페이스를 구현해 적용할 수 있습니다.

public class ThrottlingRoutePolicy extends RoutePolicySupport {
  private final RateLimiter rateLimiter = RateLimiter.create(100); // 초당 100회

  @Override
  public void onExchangeBegin(Route route, Exchange exchange) {
    if (!rateLimiter.tryAcquire()) {
      exchange.setException(new TooManyRequestsException("요청 한도 초과"));
    }
  }
}

// 라우트에 적용
from("direct:api")
  .routePolicy(new ThrottlingRoutePolicy())
  .to("bean:service");

역할 기반 접근 제어 (RBAC)

사용자 역할에 따라 라우트 접근을 제한하는 패턴입니다.

from("direct:adminOperation")
  .process(exchange -> {
    String role = exchange.getIn().getHeader("userRole", String.class);
    if (!"ADMIN".equals(role)) {
      throw new AccessDeniedException("관리자 권한 필요");
    }
  })
  .to("bean:adminService");

from("direct:readOperation")
  .process(exchange -> {
    String role = exchange.getIn().getHeader("userRole", String.class);
    if (!Arrays.asList("ADMIN", "USER", "READ_ONLY").contains(role)) {
      throw new AccessDeniedException("권한 없음");
    }
  })
  .to("bean:readService");

감사 로깅 (Audit Logging)

보안 요구사항으로 누가 무엇을 언제 했는지 기록해야 합니다. Wire Tap과 이벤트 저장소를 결합합니다.

// 모든 민감한 작업에 감사 로그 추가
from("direct:sensitiveOperation")
  .process(exchange -> {
    exchange.getIn().setHeader("auditUserId",
      SecurityContextHolder.getContext().getAuthentication().getName());
    exchange.getIn().setHeader("auditTimestamp", LocalDateTime.now().toString());
    exchange.getIn().setHeader("auditAction", "sensitiveOperation");
  })
  .wireTap("direct:writeAuditLog")
  .to("bean:sensitiveService");

from("direct:writeAuditLog")
  .to("sql:INSERT INTO audit_log (user_id, action, timestamp, payload) "
    + "VALUES (:#${header.auditUserId}, :#${header.auditAction}, "
    + ":#${header.auditTimestamp}, :#${body})");

IP 화이트리스트 필터링

from("netty-http:http://0.0.0.0:8080/api")
  .process(exchange -> {
    String clientIp = exchange.getIn()
      .getHeader("CamelNettyRemoteAddress", String.class);
    if (!allowedIps.contains(clientIp)) {
      exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 403);
      exchange.getIn().setBody("접근 거부");
      exchange.setRouteStop(true);
    }
  })
  .to("bean:apiService");

보안 테스트

보안 기능은 반드시 테스트해야 합니다. 인증 실패, 권한 부족, SQL 인젝션 시도 등 다양한 보안 시나리오를 테스트합니다.

@Test
public void testUnauthorizedAccess() {
  Exchange result = template.request("direct:adminOperation", exchange -> {
    exchange.getIn().setHeader("userRole", "USER");
    exchange.getIn().setBody("test");
  });

  assertNotNull(result.getException());
  assertThat(result.getException()).isInstanceOf(AccessDeniedException.class);
}

zerg96

Share
Published by
zerg96

Recent Posts

[Apache Camel] 2025년 최신 트렌드 – AI 통합과 서버리스 Camel의 미래

2025년 Apache Camel의 최신 트렌드를 분석합니다. AI/LLM 통합 컴포넌트, 서버리스 배포, Camel K 진화, WebAssembly…

10시간 ago

[Camel in Action] 완결편 – Apache Camel 전체 여정 회고와 다음 단계

Camel in Action을 완독한 후 Apache Camel의 전체 그림을 다시 정리합니다. 핵심 철학, 학습 경로,…

10시간 ago

[Camel in Action] 실전편 – Camel 마이그레이션 가이드 2.x에서 4.x까지

Apache Camel 2.x에서 3.x, 4.x로 마이그레이션하는 단계별 가이드입니다. 주요 API 변경사항, 제거된 컴포넌트, 자동화 도구…

10시간 ago

[Camel in Action] 실전편 – Camel 라우트 디버깅 기법과 문제 해결 가이드

Apache Camel 라우트에서 발생하는 문제를 디버깅하고 해결하는 실전 기법을 설명합니다. 로그 분석, breakpoint 디버깅, Tracer,…

10시간 ago

[Camel in Action] 실전편 – Camel 도입 전 반드시 알아야 할 것들

Apache Camel을 프로젝트에 도입하기 전 알아야 할 핵심 사항을 정리합니다. 학습 곡선, 도입 비용, 적합한…

10시간 ago

[Camel in Action] 실전편 – Enterprise Integration Patterns 20가지 핵심 정리

엔터프라이즈 통합 패턴(EIP) 20가지를 Apache Camel 코드와 함께 한 번에 정리합니다. 메시징 채널, 메시지 라우팅,…

10시간 ago