🧅

Rack & Middleware

Rails 아래에서 동작하는 HTTP 처리 레이어

Rack은 Ruby의 웹 서버(Puma, Unicorn)와 웹 프레임워크(Rails, Sinatra) 사이의 표준 인터페이스입니다. 규약은 매우 간단합니다: call(env) 메서드가 [status, headers, body] 배열을 반환하면 됩니다.

Rails 자체도 하나의 Rack 앱입니다. 요청이 들어오면 여러 Middleware를 거치고, 마지막에 Rails 라우터에 도달합니다.

주요 Middleware (rake middleware로 확인 가능):

  • ActionDispatch::SSL — HTTPS 강제

  • ActionDispatch::Cookies — 쿠키 처리

  • ActionDispatch::Session — 세션 관리

  • ActionDispatch::Flash — 플래시 메시지

  • Rack::MethodOverride — PUT/PATCH/DELETE 메서드 지원

  • ActionDispatch::RequestId — 요청 추적 ID 부여

커스텀 Middleware를 작성하여 요청 로깅, 인증, CORS 처리 등을 Rails 앱과 독립적으로 처리할 수 있습니다.

구조 다이어그램

요청이 Middleware 스택을 통과하는 과정 (양파 모델):
🌐 HTTP Request
Rack::SSL HTTPS 강제
ActionDispatch::Cookies 쿠키 처리
ActionDispatch::Session 세션 관리
ActionDispatch::Flash 플래시 메시지
Rack::MethodOverride PUT/PATCH/DELETE 지원
ActionDispatch::RequestId 요청 추적 ID
Rails Router → Controller#Action
응답도 역순으로 Middleware를 통과
핵심: 요청/응답이 <strong>Middleware 레이어를 순차 통과</strong> — 각 레이어가 독립적으로 처리

핵심 포인트

1

HTTP 요청이 웹 서버(Puma)에 도착

2

Rack 인터페이스를 통해 Middleware 스택으로 전달

3

각 Middleware가 순서대로 요청을 처리/수정 (양파 껍질 모델)

4

Rails Router에 도달 → Controller#Action 실행

5

응답이 Middleware 스택을 역순으로 통과하며 가공

6

최종 응답 [status, headers, body]이 브라우저에 반환

장점

  • 관심사의 분리 — Rails 코드를 건드리지 않고 기능 추가
  • Ruby 웹 프레임워크 간 호환 (Rails, Sinatra 등)
  • 테스트 용이 (독립적 유닛)
  • 요청/응답 파이프라인 커스터마이징

단점

  • 미들웨어 순서가 중요 — 잘못 배치하면 동작 안 함
  • 디버깅 시 어느 미들웨어에서 문제인지 찾기 어려움
  • 과도한 미들웨어는 성능 저하
  • 추상화 레이어가 추가되어 복잡도 증가

사용 사례

커스텀 인증 미들웨어 API 요청 로깅 CORS 처리 Rate Limiting