getMessage()); } } // 도우미 함수 정의 function apiResponse($error = null) { $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' 사용 $redisHost = getenv('REDIS_HOST') ?: 'infra-redis'; // ✅ 가능 $redisPort = getenv('REDIS_PORT') ?: 6379; $success = $redis->connect($redisHost, $redisPort); 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() ]); }