미들웨어는 HTTP 요청이 애플리케이션의 핵심 로직(라우트 콜백)에 도달하기 전과 후에 특정 코드를 실행할 수 있게 해주는 양파 모양의 레이어(Onion Architecture)입니다. 인증(Authentication), 로깅, CORS 설정 등에 주로 사용됩니다.
1. 미들웨어의 작동 원리
Slim 미들웨어는 Request 객체와 다음 계층으로 넘겨주는 핸들러(RequestHandler)를 받습니다. "요청 가로채기 ➡️ 다음 계층으로 넘기기 ➡️ 응답 가로채기"의 순서로 진행됩니다.
2. 미들웨어 작성 및 적용
인증 토큰(API Key)이 올바른지 검사하는 간단한 보안 미들웨어 예시입니다.
index.php
<?php
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Slim\Psr7\Response;
// 1. 미들웨어 클로저 정의
$authMiddleware = function (Request $request, RequestHandler $handler) {
// 요청 검문: 헤더에 올바른 토큰이 있는지 확인
$token = $request->getHeaderLine('Authorization');
if ($token !== 'Bearer secret-token-123') {
// 검문 실패: 다음 계층으로 넘기지 않고 즉시 에러 응답 반환! (요청 차단)
$response = new Response();
$response->getBody()->write(json_encode(['error' => '인증 실패']));
return $response->withStatus(401)->withHeader('Content-Type', 'application/json');
}
// 검문 통과: 다음 미들웨어나 최종 애플리케이션 로직으로 진행
$response = $handler->handle($request);
// 최종 응답을 클라이언트에 보내기 전, 헤더 추가 등의 후처리 가능
return $response->withHeader('X-Middleware-Passed', 'true');
};
// 2. 미들웨어 적용 (특정 라우트에만 적용)
$app->get('/api/secure-data', function ($request, $response) {
$response->getBody()->write("보안 데이터에 접근 성공!");
return $response;
})->add($authMiddleware); // 여기에 미들웨어 장착
?>
GET localhost:8080/api/secure-data
Headers: Authorization: Bearer secret-token-123 Status:200 OK
보안 데이터에 접근 성공!
⚠️ 주의: 미들웨어 적용 순서 (LIFO)
Slim 프레임워크에서 미들웨어를 여러 개 add() 할 때, 가장 마지막에 추가된 미들웨어가 가장 먼저 실행(LIFO 구조)된다는 점에 각별히 주의해야 합니다!
미들웨어 동작 결과
위의 코드 실행 결과에서 볼 수 있듯, Authorization 헤더에 올바른 토큰을 전송하면 미들웨어 검문을 통과하여 핵심 로직이 실행되고 정상적인 응답(200 OK)을 반환하게 됩니다.