From 32efe755e60e780c30713c9262bf5d15c7c774bb Mon Sep 17 00:00:00 2001 From: jjstyle Date: Wed, 11 Mar 2026 09:55:11 +0900 Subject: [PATCH] =?UTF-8?q?=ED=98=B8=EC=B6=9C=EC=8B=9C=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- worker/api_receiver.php | 166 +++++++++++++++++++++------------------- 1 file changed, 89 insertions(+), 77 deletions(-) diff --git a/worker/api_receiver.php b/worker/api_receiver.php index e3efbd4..a5dcd64 100644 --- a/worker/api_receiver.php +++ b/worker/api_receiver.php @@ -4,77 +4,6 @@ * - 프레임워크를 로드하지 않아 매우 빠르고 안전함 * - 받은 데이터를 Redis 큐에 넣고 즉시 응답 */ -// 1. 응답 헤더 설정 (JSON) -header('Content-Type: application/json; charset=utf-8'); - -// 2. 보안 키 체크 (URL 파라미터 key=값) -$configKey = "7EE868F4B36D36B3D86736828F4729EAC4992083"; // 실제 사용할 키값으로 변경하세요 -$receivedKey = $_GET['key'] ?? ''; -$logDir = __DIR__ . '/logs/'; - -if ($receivedKey !== $configKey) { - http_response_code(403); - echo apiResponse([ - 'code' => '-1', - 'message' => 'Unregistered key' - ]); - exit; -} - -try { - // 3. 데이터 수신 (POST JSON 또는 GET 파라미터) - $rawData = file_get_contents('php://input'); - $data = json_decode($rawData, true); - - if (empty($data)) { - throw new Exception("Empty data received"); - } - - // 4. Redis 연결 - $redis = new Redis(); - // Docker 서비스 이름인 'redis' 사용 - $success = $redis->connect('redis', 6379); - - if (!$success) { - throw new Exception("Could not connect to Redis"); - } - - $redis->select(9); // 10번 DB 사용 - - // 5. 큐에 넣을 데이터 포맷팅 - $payload = [ - 'request_data' => $data, - 'received_at' => date('Y-m-d H:i:s'), - 'client_ip' => $_SERVER['REMOTE_ADDR'] - ]; - - // 'naver:raw_queue'라는 이름의 리스트에 저장 - $redis->lPush('naver:raw_queue', json_encode($payload)); - - // --- [여기서부터 로그 저장 코드 추가] --- - // 들어온 원본($rawData)을 그대로 기록합니다. - writeLog("RAW_RECEIVE | " . $rawData, 'INFO'); - // -------------------------------------- - // 6. 네이버측에 성공 응답 (202 Accepted) - // 처리가 완료된 것은 아니지만, 접수는 완료되었음을 의미 - http_response_code(200); - echo apiResponse([ - 'code' => 'success', - 'message' => '' - ]); - - -} catch (Exception $e) { - // 7. 장애 발생 시 로그 기록 (시스템 로그) - writeLog( 'Exception :' . apiResponse($data) , 'ERROR'); - - http_response_code(500); - - echo apiResponse([ - 'code' => '-1', - 'message' => $e->getMessage() - ]); -} /** * 날짜별 로그 기록 함수 @@ -106,12 +35,95 @@ function writeLog($message, $level = 'ERROR') { // 도우미 함수 정의 function apiResponse($error = null) { - // $base = [ - // '@type' => 'response', - // '@service' => 'confirms', - // '@version' => '1.0.0' - // ]; - // if ($error) $base['error'] = $error; $base = $error; return json_encode($base); +} + +// 1. 응답 헤더 설정 (JSON) +header('Content-Type: application/json; charset=utf-8'); + +// ===== 최우선: 모든 호출 정보를 로그에 저장 (보안 키 체크 전) ===== +$protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http"; +$fullUrl = $protocol . "://" . ($_SERVER['HTTP_HOST'] ?? 'localhost') . ($_SERVER['REQUEST_URI'] ?? ''); +$rawData = file_get_contents('php://input'); + +$requestInfo = [ + 'timestamp' => date('Y-m-d H:i:s'), + 'method' => $_SERVER['REQUEST_METHOD'] ?? 'UNKNOWN', + 'full_url' => $fullUrl, + 'request_uri' => $_SERVER['REQUEST_URI'] ?? '', + 'query_string' => $_SERVER['QUERY_STRING'] ?? '', + 'get_params' => $_GET, + 'post_data' => $rawData, + 'client_ip' => $_SERVER['REMOTE_ADDR'] ?? '', + 'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '', + 'referer' => $_SERVER['HTTP_REFERER'] ?? '', +]; + +writeLog("REQUEST_INFO | " . json_encode($requestInfo, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), 'INFO'); +// ================================================================ + +// 2. 보안 키 체크 (URL 파라미터 key=값) +$configKey = "7EE868F4B36D36B3D86736828F4729EAC4992083"; // 실제 사용할 키값으로 변경하세요 +$receivedKey = $_GET['key'] ?? ''; +$logDir = __DIR__ . '/logs/'; + +if ($receivedKey !== $configKey) { + writeLog("SECURITY_FAIL | Invalid key: $receivedKey", 'WARNING'); + http_response_code(403); + echo apiResponse([ + 'code' => '-1', + 'message' => 'Unregistered key' + ]); + exit; +} + +try { + // 3. 데이터 수신 (POST JSON 또는 GET 파라미터) + $data = json_decode($rawData, true); + + if (empty($data)) { + throw new Exception("Empty data received"); + } + + // 4. Redis 연결 + $redis = new Redis(); + // Docker 서비스 이름인 'redis' 사용 + $success = $redis->connect('redis', 6379); + + if (!$success) { + throw new Exception("Could not connect to Redis"); + } + + $redis->select(9); // 10번 DB 사용 + + // 5. 큐에 넣을 데이터 포맷팅 + $payload = [ + 'request_data' => $data, + 'received_at' => date('Y-m-d H:i:s'), + 'client_ip' => $_SERVER['REMOTE_ADDR'] + ]; + + // 'naver:raw_queue'라는 이름의 리스트에 저장 + $redis->lPush('naver:raw_queue', json_encode($payload)); + + // 6. 네이버측에 성공 응답 (202 Accepted) + // 처리가 완료된 것은 아니지만, 접수는 완료되었음을 의미 + http_response_code(200); + echo apiResponse([ + 'code' => 'success', + 'message' => '' + ]); + + +} catch (Exception $e) { + // 7. 장애 발생 시 로그 기록 (시스템 로그) + writeLog( 'Exception :' . apiResponse($data) , 'ERROR'); + + http_response_code(500); + + echo apiResponse([ + 'code' => '-1', + 'message' => $e->getMessage() + ]); } \ No newline at end of file