잉카인터넷
경력근거: 기존 Kernel Extension(KEXT) 기반 기능을 최신 macOS 환경에 맞는
※ 실제 산출물이 아닌 AI 예측 시안입니다.
이번 잉카인터넷 공고의 주 업무는 macOS 키보드 보안을 기존 Kernel Extension(KEXT) 기반에서 System Extension 과 사용자 모드 보안 모듈로 옮기는 일이고, 에이전트와 웹을 한 사람이 끝까지 맡는 자리입니다. 전환 기간에는 고객사 Mac 들에 KEXT 버전과 시스템 확장 버전이 섞여 돌고, macOS 업데이트 한 번에 어제까지 돌던 KEXT 버전이 멈춥니다. 전환을 만드는 사람이 관리 웹에 "이 Mac 에서 지금 도는가" 를 보여줄 판정표를 함께 내야 고객사 보안 담당자가 전환을 따라옵니다. 공고가 PKG 설치·제거·업데이트와 Code Signing·Notarization 을 적은 것도 이 판정이 3주차 전환 계획으로 이어지는 자리입니다. 이 편이 만드는 것은 칸 수가 다른 버전 문자열을 견주는 비교기와 경과 시간 판정, 그 결과를 읽는 화면까지입니다. 키보드 입력 가로채기 방지와 Endpoint Security 이벤트 처리는 이 편에서 만들지 않습니다.
공고는 기존 Kernel Extension 기반 기능을 최신 macOS 환경에 맞게 옮기는 일을 주 포지션으로 적었습니다. 옮기는 동안 고객사 Mac 에는 두 방식이 섞여 돌고, 어느 Mac 이 옛 방식에 남아 멈췄는지가 보안 담당자의 첫 질문이 됩니다.
에이전트와 웹을 포함한 솔루션을 1인으로 개발하고 유지하는 자리라, 에이전트가 보내는 상태와 관리 웹의 판정표를 같은 사람이 이어서 만듭니다. 2주차 응답 데몬과 1주차 판정 화면이 그 두 끝입니다.
PKG 제작, Code Signing·Notarization·Entitlements, PKG 기반 설치·제거·업데이트 경험이 적혀 있습니다. 판정에서 걸린 Mac 을 어느 버전으로 어떤 순서로 올릴지 내는 3주차가 이 줄들과 닿습니다.
관리 서버에서 내려받은 사내 Mac 에이전트 목록, 에이전트 버전별 지원 macOS 범위, 단말 그룹별 승인 기한과 응답 기준 세 표를 받아 Mac 한 대마다 키보드 보안이 지금 도는지 판정하는 관리자 페이지입니다. 설치 여부만 보는 대신 macOS 버전을 지원 범위와 칸 단위로 견주고, 시스템 확장 승인 대기 시간과 마지막 응답 이후 경과를 그룹 기준과 잽니다. 보안 담당자는 커널에 직접 올라가는 옛 방식(KEXT)의 에이전트가 남은 Mac 과 승인이 밀린 Mac 을 판정별로 보고 사용자에게 조치를 요청합니다.
고객사에서 사내 Mac 들의 보안 에이전트를 관리 웹으로 챙기는 보안 담당자
지금 관리 웹은 에이전트가 설치됐는지와 버전 숫자를 보여주지만, 그 버전이 단말의 macOS 에서 실제로 도는지는 보안 담당자가 릴리스 노트의 지원 표를 옆에 펴고 한 대씩 맞춰 봐야 압니다. 사용자가 macOS 를 26 으로 올린 날부터 KEXT 버전은 커널 모듈이 올라오지 않는데 목록에는 설치됨으로 남습니다. 지원 범위, 승인 기한, 응답 기준을 표로 두고 단말마다 계산하면 보호가 꺼진 Mac 이 그날 목록 맨 위에 올라옵니다.
보안 담당자가 에이전트 목록, 지원 버전 표, 그룹 기준 세 파일을 올리면 Mac 마다 다섯 판정 가운데 하나가 붙고, 한 대를 펼치면 걸린 버전 범위와 경과 시간이 나오는 관리자 페이지입니다. 에이전트 목록은 관리 서버가 내보낸 CSV 를 받는다고 두고 시작합니다.
Swift 로 만든 LaunchDaemon 이 제 Mac 의 macOS 버전과 systemextensionsctl 결과를 읽어 5분마다 관리 화면에 응답을 보내, 실제 한 대가 판정 목록에 섭니다. 단말 150대에 손으로 매긴 정답과 자동 판정을 견줘 판정별 일치율도 냅니다.
KEXT 판정과 지원 범위 밖 판정을 받은 Mac 마다 그 macOS 에서 도는 가장 최근 시스템 확장 버전을 지원 표에서 골라, 그룹별 PKG 업데이트 순서를 냅니다. 서명과 공증을 거친 PKG 로 제 Mac 에서 설치·제거·업데이트를 한 번씩 돌려 봅니다.
보안 담당자가 세 파일을 올리면 Mac 15대 가운데 조치가 필요한 아홉 대가 판정별로 나오고, 기한 안에서 승인을 기다리는 한 대는 보호 중 묶음 안에 승인 대기로 따로 표시됩니다. 한 대를 펼치면 지원 상한과 경과 시간이 보입니다.
상한 13 과 13.7.2 처럼 칸 수가 다른 버전, 응답이 기준과 꼭 같은 30분 전인 단말, 설치 뒤 한 번도 응답하지 않은 단말, 지원 표에 없는 시험 빌드를 섞어도 Mac 마다 판정이 하나씩 붙습니다.
버전 칸에 글자가 섞이거나 시각 칸이 빈 CSV 20종을 넣어도 목록이 멈추지 않고 문제가 된 단말만 따로 보입니다.
단말 150대에 제가 미리 적은 상태와 도구의 판정을 나란히 놓고, 판정마다 몇 대가 같은지(일치율)를 셉니다. 목록과 정답을 모두 제가 만들었으니 이 숫자는 판정 차례와 버전 비교가 일관되게 도는지 보는 값입니다.
제가 말할 수 있는 범위는 제 Mac 한 대의 실제 응답과 지어낸 목록에서 판정이 서는 데까지입니다. 고객사 Mac 수백 대에서 보호가 꺼진 단말을 며칠 더 빨리 찾는지는 잉카인터넷 관리 서버의 실목록과 업데이트 이력이 있어야 잽니다.
지원 버전 표와 단말 목록을 제가 지어냈고 정답도 제가 매겼습니다. 일치율은 규칙이 흔들리지 않는다는 뜻일 뿐이라, 면접에서는 판정 차례와 제 Mac 에서 돈 응답 데몬까지를 말씀드립니다.
깨끗한 목록만 넣으면 버전 비교가 틀려도 드러나지 않습니다. 칸 수가 다른 버전, 기준과 꼭 같은 경과, 응답이 한 번도 없는 단말, 목록에 없는 시험 빌드를 일부러 넣었습니다.
승인 기한 안에 있는 미승인 단말은 판정값이 보호 중이지만 실제로는 승인 전이라 키보드 보호가 켜지지 않았습니다. 판정 다섯 가지에 승인 대기 값이 없어 awaiting_approval 칸과 화면의 승인 대기 표시로 따로 세웁니다. 기한 안의 승인 대기를 판정으로 올릴지는 제품 담당자와 다시 정할 일입니다.
이 포트폴리오는 버전 범위 대조와 경과 시간 판정을 보여줍니다. 키보드 입력 가로채기 방지나 Endpoint Security 이벤트 처리의 깊이는 주장하지 않습니다.
실제 지원 여부는 macOS 버전만이 아니라 Apple Silicon 과 Intel, 보안 부팅 설정에 따라 갈립니다. 이 편은 버전 축 하나만 다루고, 칩과 부팅 설정 축을 붙이는 일은 도입 단계 과제로 둡니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
관리 서버에서 내려받은 사내 Mac 에이전트 목록입니다. 설치 뒤 한 번도 응답하지 않아 마지막 응답이 비어 있는 단말, 지원 표에 없는 시험 빌드, 지원 상한 13 과 주 버전이 같은 macOS 13.7.2 단말, 기한 안에서 시스템 확장 승인을 기다리는 단말을 담았습니다.
| device_id | device_group | macos_version | agent_version | module_type | sysext_approved | installed_at | last_heartbeat_at | exported_at |
|---|---|---|---|---|---|---|---|---|
| MAC-0142 | 트레이딩룸 | 26.0 | 3.8.2 | kext | — | 2025-11-03T10:20:00 | 2026-09-26T08:58:00 | 2026-09-26T09:00:00 |
| MAC-0115 | 본사-재무 | 14.6 | 4.0.3 | sysext | true | 2026-03-10T11:00:00 | 2026-09-26T08:57:00 | 2026-09-26T09:00:00 |
| MAC-0188 | 개발 | 26.0 | 4.0.3 | sysext | true | 2026-02-18T14:30:00 | 2026-09-26T08:40:00 | 2026-09-26T09:00:00 |
| MAC-0207 | 리테일-강남지점 | 26.0 | 4.1.2 | sysext | false | 2026-09-23T10:00:00 | 2026-09-26T08:59:00 | 2026-09-26T09:00:00 |
| MAC-0233 | 콜센터 | 15.4 | 4.1.2 | sysext | true | 2026-08-01T09:40:00 | 2026-09-26T06:00:00 | 2026-09-26T09:00:00 |
아래 JSON Schema 에 맞는 사내 Mac 에이전트 목록 행을 더 만들어 주세요. {"type":"object","properties":{"device_id":{"type":"string"},"device_group":{"type":"string"},"macos_version":{"type":"string","description":"sw_vers 가 돌려준 macOS 버전 문자열입니다. 점으로 나눈 숫자 2~3칸입니다."},"agent_version":{"type":"string"},"module_type":{"type":"string","enum":["kext","sysext"]},"sysext_approved":{"type":["boolean","null"],"description":"시스템 확장을 사용자가 승인했는지입니다. module_type 이 kext 이면 해당이 없어 비웁니다."},"installed_at":{"type":"string"},"last_heartbeat_at":{"type":["string","null"],"description":"에이전트가 마지막으로 관리 서버에 응답한 시각입니다. 설치 뒤 한 번도 응답하지 않았으면 비웁니다."},"exported_at":{"type":"string","description":"관리 서버에서 이 목록을 내려받은 시각입니다. 경과 시간은 모두 이 시각을 기준으로 계산합니다."}},"required":["device_id","device_group","macos_version","agent_version","module_type","sysext_approved","installed_at","last_heartbeat_at","exported_at"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) last_heartbeat_at 이 null 인 단말, (2) support_matrix 에 없는 agent_version(시험 빌드), (3) macos_version 이 macos_max 와 같은 주 버전의 패치 버전인 kext 단말, (4) exported_at 과 last_heartbeat_at 의 차가 rollout_policy.heartbeat_timeout_min 과 정확히 같은 단말, (5) module_type 이 kext 인데 macOS 26 인 단말. kext 행은 sysext_approved 를 null 로 두고, 한 목록의 exported_at 은 모두 같게 합니다. 생성한 행은 반드시 위 스키마를 통과해야 합니다.{"type":"object","properties":{"device_id":{"type":"string"},"device_group":{"type":"string"},"macos_version":{"type":"string","description":"sw_vers 가 돌려준 macOS 버전 문자열입니다. 점으로 나눈 숫자 2~3칸입니다."},"agent_version":{"type":"string"},"module_type":{"type":"string","enum":["kext","sysext"]},"sysext_approved":{"type":["boolean","null"],"description":"시스템 확장을 사용자가 승인했는지입니다. module_type 이 kext 이면 해당이 없어 비웁니다."},"installed_at":{"type":"string"},"last_heartbeat_at":{"type":["string","null"],"description":"에이전트가 마지막으로 관리 서버에 응답한 시각입니다. 설치 뒤 한 번도 응답하지 않았으면 비웁니다."},"exported_at":{"type":"string","description":"관리 서버에서 이 목록을 내려받은 시각입니다. 경과 시간은 모두 이 시각을 기준으로 계산합니다."}},"required":["device_id","device_group","macos_version","agent_version","module_type","sysext_approved","installed_at","last_heartbeat_at","exported_at"]}에이전트 빌드마다 모듈 종류와 지원 macOS 범위를 적은 기준 표입니다. 상한을 13 처럼 주 버전 한 칸으로 적은 행과 10.15 처럼 두 칸으로 적은 행이 섞여 있습니다.
| agent_version | module_type | macos_min | macos_max | released_at |
|---|---|---|---|---|
| 3.7.4 | kext | 10.15 | 12 | 2023-04-10 |
| 3.8.0 | kext | 11 | 13 | 2023-11-02 |
| 3.8.2 | kext | 11 | 13 | 2024-02-19 |
| 3.9.1 | kext | 12 | 14 | 2024-08-05 |
| 4.0.0 | sysext | 13 | 15 | 2025-01-13 |
아래 JSON Schema 에 맞는 에이전트 지원 버전 행을 더 만들어 주세요. {"type":"object","properties":{"agent_version":{"type":"string"},"module_type":{"type":"string","enum":["kext","sysext"]},"macos_min":{"type":"string","description":"지원하는 가장 낮은 macOS 버전입니다. 적힌 칸까지만 견줍니다."},"macos_max":{"type":"string","description":"지원하는 가장 높은 macOS 버전입니다. 13 처럼 한 칸만 적으면 13.x 전체를 포함합니다."},"released_at":{"type":"string"}},"required":["agent_version","module_type","macos_min","macos_max","released_at"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) macos_max 를 주 버전 한 칸으로만 적은 행, (2) macos_min 을 10.15 처럼 두 칸으로 적은 행, (3) 같은 주 버전 안에서 패치만 다른 빌드 두 개. kext 빌드의 macos_max 는 14 이하로 둡니다. 생성한 행은 반드시 위 스키마를 통과해야 합니다.{"type":"object","properties":{"agent_version":{"type":"string"},"module_type":{"type":"string","enum":["kext","sysext"]},"macos_min":{"type":"string","description":"지원하는 가장 낮은 macOS 버전입니다. 적힌 칸까지만 견줍니다."},"macos_max":{"type":"string","description":"지원하는 가장 높은 macOS 버전입니다. 13 처럼 한 칸만 적으면 13.x 전체를 포함합니다."},"released_at":{"type":"string"}},"required":["agent_version","module_type","macos_min","macos_max","released_at"]}단말 그룹마다 시스템 확장 승인 기한과 응답 끊김 기준을 적은 기준 표입니다. 트레이딩룸처럼 기준이 짧은 그룹과 임원실처럼 긴 그룹을 담았습니다.
| device_group | approval_grace_hours | heartbeat_timeout_min | updated_at |
|---|---|---|---|
| 본사-재무 | 48 | 30 | 2026-03-02 |
| 본사-인사 | 48 | 30 | 2026-03-02 |
| 리테일-강남지점 | 48 | 30 | 2026-04-15 |
| 리테일-여의도지점 | 48 | 30 | 2026-04-15 |
| 콜센터 | 48 | 30 | 2026-05-07 |
아래 JSON Schema 에 맞는 단말 그룹 기준 행을 더 만들어 주세요. {"type":"object","properties":{"device_group":{"type":"string"},"approval_grace_hours":{"type":"integer","minimum":1},"heartbeat_timeout_min":{"type":"integer","minimum":1},"updated_at":{"type":"string"}},"required":["device_group","approval_grace_hours","heartbeat_timeout_min","updated_at"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) approval_grace_hours 가 24 이하인 그룹, (2) heartbeat_timeout_min 이 120 이상인 그룹, (3) updated_at 이 최근이라 단말 설치 시점보다 뒤인 그룹. 생성한 행은 반드시 위 스키마를 통과해야 합니다.{"type":"object","properties":{"device_group":{"type":"string"},"approval_grace_hours":{"type":"integer","minimum":1},"heartbeat_timeout_min":{"type":"integer","minimum":1},"updated_at":{"type":"string"}},"required":["device_group","approval_grace_hours","heartbeat_timeout_min","updated_at"]}| Swift | 2주차 응답 데몬과 3주차 PKG 설치 후 확인 스크립트를 씁니다. macOS 버전 문자열을 칸 단위로 견주는 비교기도 같은 규칙으로 옮겨 에이전트와 웹이 같은 답을 냅니다. |
| Objective-C | 기존 에이전트가 버전과 모듈 종류를 내보내는 코드를 읽어 목록의 열 이름을 그 구조체와 맞춥니다. |
| C / C++ | KEXT 쪽이 남기는 모듈 로드 결과를 어디서 읽는지 확인하는 자리이며, 이 편에서는 로드 여부를 목록 열로 옮기는 데까지만 다룹니다. |
| macOS System Extension | sysext 행의 승인 상태가 어디서 오는지 맞추고, 2주차에 systemextensionsctl list 결과로 제 Mac 의 실제 승인 상태를 읽습니다. |
| macOS Daemon / Background Process | 2주차에 LaunchDaemon 으로 5분마다 응답을 보내는 상주 프로세스를 만듭니다. |
| macOS IPC | 응답 데몬이 사용자 모드 에이전트에게 모듈 상태를 묻는 통로를 XPC 로 둡니다. |
| Agent와 웹브라우저 간 통신 | 응답 데몬이 보낸 상태가 관리 화면 목록에 바로 반영되는 경로입니다. 관리 화면은 TypeScript 와 React 로 짭니다. |
| PKG 설치 / 제거 / 업데이트 | 3주차 전환 계획의 실행 단위입니다. 그룹별 업데이트 순서가 PKG 배포 순서가 됩니다. |
| Code Signing / Notarization / Entitlements | 3주차 PKG 를 서명·공증하고 시스템 확장에 필요한 entitlement 를 적어 제 Mac 에서 설치가 막히지 않는지 봅니다. |
| Git | 판정 규칙과 지원 버전 표를 같은 저장소에 두고, 지원 표가 바뀌면 판정 테스트가 함께 돌게 합니다. |
| Claude / Claude Code | 판정이 걸린 Mac 마다 사용자에게 보낼 조치 요청 문장을 쓰고, 개발 중에는 데몬과 비교기 초안을 짜는 CLI 도구로 씁니다. |
✓ pass → 여기서 멈춰도 보안 담당자가 쓰는 완결품입니다. 더 키우려면 2주차에 제 Mac 의 실제 응답을 붙입니다.
✓ pass → 3주차 전환 계획과 PKG 업데이트로 넘어갑니다. 어긋난 판정이 몰리면 버전 비교 규칙부터 다시 봅니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · device_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
보호 중보호 중이 macOS 에서 안 도는 KEXT 버전KEXT 미동작지원 범위 밖의 에이전트 버전지원 범위 밖시스템 확장 승인 기한을 넘김승인 기한 초과에이전트 응답 끊김응답 끊김키보드 보안 동작 판정 형식입니다. Mac 한 대가 지원 표와 그룹 기준에 견줘 어떤 판정을 받는지 남기며, 판정은 규칙이 정하고 사용자에게 보낼 조치 문장만 모델이 씁니다.
{"type":"object","properties":{"device_id":{"type":"string"},"device_group":{"type":"string"},"verdict":{"type":"string","enum":["보호 중","이 macOS 에서 안 도는 KEXT 버전","지원 범위 밖의 에이전트 버전","시스템 확장 승인 기한을 넘김","에이전트 응답 끊김"]},"matched_agent_version":{"type":["string","null"],"description":"support_matrix 에서 찾은 agent_version 입니다. 못 찾으면 비웁니다."},"heartbeat_age_min":{"type":["integer","null"],"description":"exported_at 에서 last_heartbeat_at 을 뺀 분입니다. last_heartbeat_at 이 비면 installed_at 을 대신 씁니다."},"approval_elapsed_hours":{"type":["integer","null"],"description":"module_type 이 sysext 이고 sysext_approved 가 거짓일 때만 exported_at 에서 installed_at 을 뺀 시간(내림)입니다. 그 밖에는 비웁니다."},"awaiting_approval":{"type":"boolean","description":"module_type 이 sysext 이고 sysext_approved 가 거짓인데 승인 기한 안이라 verdict 가 보호 중으로 남은 단말이면 true 입니다. 이 단말은 키보드 보호가 아직 켜지지 않았습니다. 그 밖에는 false 입니다."},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":["string","null"],"enum":["count","sum","avg","min","max",null]},"value":{}},"required":["field","value"]}},"summary":{"type":"string","description":"보안 담당자가 단말 사용자에게 조치를 요청할 때 옮겨 적는 한 문장입니다."},"hedge":{"type":["string","null"]}},"required":["device_id","device_group","verdict","matched_agent_version","awaiting_approval","evidence","summary"]}[
{
"device_id": "MAC-0301",
"device_group": "트레이딩룸",
"verdict": "보호 중",
"matched_agent_version": "4.1.2",
"heartbeat_age_min": 2,
"approval_elapsed_hours": null,
"awaiting_approval": false,
"evidence": [
{
"field": "device_id",
"value": "MAC-0301"
},
{
"field": "macos_version",
"value": "26.0"
},
{
"field": "macos_max",
"value": "26"
},
{
"field": "sysext_approved",
"value": true
},
{
"field": "last_heartbeat_at",
"value": "2026-09-26T08:58:00"
}
],
"summary": "MAC-0301 은 macOS 26.0 을 지원하는 시스템 확장 4.1.2 가 승인된 채 2분 전에 응답해 키보드 보안이 돌고 있습니다.",
"hedge": null
},
{
"device_id": "MAC-0312",
"device_group": "본사-인사",
"verdict": "보호 중",
"matched_agent_version": "4.2.1",
"heartbeat_age_min": 30,
"approval_elapsed_hours": null,
"awaiting_approval": false,
"evidence": [
{
"field": "device_id",
"value": "MAC-0312"
},
{
"field": "last_heartbeat_at",
"value": "2026-09-26T08:30:00"
},
{
"field": "exported_at",
"value": "2026-09-26T09:00:00"
},
{
"field": "heartbeat_timeout_min",
"value": 30
}
],
"summary": "MAC-0312 은 마지막 응답이 정확히 30분 전이라 본사-인사 그룹 기준 30분을 넘지 않았습니다.",
"hedge": "기준과 같은 30분은 넘은 것으로 보지 않습니다. 다음 응답이 한 번만 늦어도 응답 끊김으로 넘어갑니다."
},
{
"device_id": "MAC-0142",
"device_group": "트레이딩룸",
"verdict": "이 macOS 에서 안 도는 KEXT 버전",
"matched_agent_version": "3.8.2",
"heartbeat_age_min": 2,
"approval_elapsed_hours": null,
"awaiting_approval": false,
"evidence": [
{
"field": "device_id",
"value": "MAC-0142"
},
{
"field": "module_type",
"value": "kext"
},
{
"field": "agent_version",
"value": "3.8.2"
},
{
"field": "macos_version",
"value": "26.0"
},
{
"field": "macos_max",
"value": "13"
}
],
"summary": "MAC-0142 는 macOS 26.0 으로 올라갔는데 키보드 보안이 macOS 13 까지만 도는 KEXT 3.8.2 로 남아 있습니다.",
"hedge": "에이전트는 2분 전에도 응답했지만 커널 모듈이 올라오지 않아 입력 보호는 꺼져 있습니다."
},
{
"device_id": "MAC-0254",
"device_group": "외부협력-PC",
"verdict": "지원 범위 밖의 에이전트 버전",
"matched_agent_version": null,
"heartbeat_age_min": 8,
"approval_elapsed_hours": null,
"awaiting_approval": false,
"evidence": [
{
"field": "device_id",
"value": "MAC-0254"
},
{
"field": "agent_version",
"value": "4.0.3-beta"
},
{
"field": "agent_version",
"agg": "count",
"value": 10
}
],
"summary": "MAC-0254 에 깔린 4.0.3-beta 는 지원 버전 목록 10개 어디에도 없는 빌드입니다.",
"hedge": "배포되지 않은 시험 빌드로 보여, 정식 4.0.3 으로 올리기 전까지는 동작을 보장하지 못합니다."
},
{
"device_id": "MAC-0207",
"device_group": "리테일-강남지점",
"verdict": "시스템 확장 승인 기한을 넘김",
"matched_agent_version": "4.1.2",
"heartbeat_age_min": 1,
"approval_elapsed_hours": 71,
"awaiting_approval": false,
"evidence": [
{
"field": "device_id",
"value": "MAC-0207"
},
{
"field": "sysext_approved",
"value": false
},
{
"field": "installed_at",
"value": "2026-09-23T10:00:00"
},
{
"field": "exported_at",
"value": "2026-09-26T09:00:00"
},
{
"field": "approval_grace_hours",
"value": 48
}
],
"summary": "MAC-0207 은 시스템 확장을 설치한 지 71시간이 지났는데 아직 승인되지 않아 강남지점 기한 48시간을 넘겼습니다.",
"hedge": null
},
{
"device_id": "MAC-0233",
"device_group": "콜센터",
"verdict": "에이전트 응답 끊김",
"matched_agent_version": "4.1.2",
"heartbeat_age_min": 180,
"approval_elapsed_hours": null,
"awaiting_approval": false,
"evidence": [
{
"field": "device_id",
"value": "MAC-0233"
},
{
"field": "last_heartbeat_at",
"value": "2026-09-26T06:00:00"
},
{
"field": "exported_at",
"value": "2026-09-26T09:00:00"
},
{
"field": "heartbeat_timeout_min",
"value": 30
}
],
"summary": "MAC-0233 은 마지막 응답이 3시간 전이라 콜센터 기준 30분을 넘겼습니다.",
"hedge": null
},
{
"device_id": "MAC-0290",
"device_group": "공용노트북",
"verdict": "에이전트 응답 끊김",
"matched_agent_version": "4.1.0",
"heartbeat_age_min": 1080,
"approval_elapsed_hours": null,
"awaiting_approval": false,
"evidence": [
{
"field": "device_id",
"value": "MAC-0290"
},
{
"field": "last_heartbeat_at",
"value": null
},
{
"field": "installed_at",
"value": "2026-09-25T15:00:00"
},
{
"field": "heartbeat_timeout_min",
"value": 60
}
],
"summary": "MAC-0290 은 어제 오후 3시에 설치된 뒤 한 번도 응답하지 않았습니다.",
"hedge": "응답 기록이 없어 설치 시각부터 경과를 셌습니다. 설치 패키지가 끝까지 돌지 않았을 수 있습니다."
},
{
"device_id": "MAC-0331",
"device_group": "콜센터",
"verdict": "이 macOS 에서 안 도는 KEXT 버전",
"matched_agent_version": "3.9.1",
"heartbeat_age_min": 1260,
"approval_elapsed_hours": null,
"awaiting_approval": false,
"evidence": [
{
"field": "device_id",
"value": "MAC-0331"
},
{
"field": "module_type",
"value": "kext"
},
{
"field": "macos_version",
"value": "26.0"
},
{
"field": "macos_max",
"value": "14"
},
{
"field": "last_heartbeat_at",
"value": "2026-09-25T12:00:00"
}
],
"summary": "MAC-0331 은 macOS 26.0 에서 macOS 14 까지만 도는 KEXT 3.9.1 을 쓰고 있어 키보드 보안이 돌지 않습니다.",
"hedge": "응답도 21시간째 끊겨 있지만 버전이 먼저 걸려 이 판정 하나만 남겼습니다. 버전을 올려도 응답이 없으면 다음 점검에서 응답 끊김으로 나옵니다."
},
{
"device_id": "MAC-0279",
"device_group": "리테일-여의도지점",
"verdict": "보호 중",
"matched_agent_version": "4.2.0",
"heartbeat_age_min": 2,
"approval_elapsed_hours": 5,
"awaiting_approval": true,
"evidence": [
{
"field": "device_id",
"value": "MAC-0279"
},
{
"field": "sysext_approved",
"value": false
},
{
"field": "installed_at",
"value": "2026-09-26T04:00:00"
},
{
"field": "exported_at",
"value": "2026-09-26T09:00:00"
},
{
"field": "approval_grace_hours",
"value": 48
}
],
"summary": "MAC-0279 는 시스템 확장을 설치한 지 5시간이라 여의도지점 기한 48시간 안이지만, 아직 승인하지 않아 키보드 보호가 켜지지 않았습니다.",
"hedge": "기한 안이라 판정은 보호 중으로 두고 승인 대기로 따로 표시합니다. 43시간 안에 승인하지 않으면 시스템 확장 승인 기한을 넘김으로 넘어갑니다."
},
{
"device_id": "MAC-0266",
"device_group": "임원실",
"verdict": "보호 중",
"matched_agent_version": "3.8.2",
"heartbeat_age_min": 50,
"approval_elapsed_hours": null,
"awaiting_approval": false,
"evidence": [
{
"field": "device_id",
"value": "MAC-0266"
},
{
"field": "module_type",
"value": "kext"
},
{
"field": "macos_version",
"value": "13.7.2"
},
{
"field": "macos_max",
"value": "13"
},
{
"field": "heartbeat_timeout_min",
"value": 120
}
],
"summary": "MAC-0266 은 macOS 13.7.2 라 KEXT 3.8.2 의 지원 상한 13 안에 들어 키보드 보안이 돌고 있습니다.",
"hedge": "상한 13 은 13.x 전체를 뜻해 첫 칸만 견줬습니다. macOS 14 로 올리는 날부터 이 KEXT 버전은 멈추니 시스템 확장 버전으로 먼저 옮겨 두십시오."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 다섯 값 가운데 하나인지 확인합니다. 2. device_id·device_group·verdict·matched_agent_version·evidence·summary 필드가 빠짐없이 존재하는지 확인합니다. 3. approval_grace_hours 와 heartbeat_timeout_min 이 1 이상인지 확인합니다. 4. heartbeat_age_min 은 exported_at 에서 last_heartbeat_at(비면 installed_at)을 뺀 분, approval_elapsed_hours 는 exported_at 에서 installed_at 을 뺀 시간으로 차이를 다시 계산합니다. 5. macOS 버전은 점으로 나눈 숫자로 견주고, macos_max 에 적힌 칸까지만 견줍니다. macos_max 가 13 이면 13.7.2 도 범위 안입니다. 6. module_type 이 kext 이고 macos_version 이 그 agent_version 의 macos_max 보다 높으면 verdict 는 이 macOS 에서 안 도는 KEXT 버전입니다. 7. agent_version 을 support_matrix 에서 못 찾거나 macos_version 이 macos_min~macos_max 사이에 없으면 verdict 는 지원 범위 밖의 에이전트 버전입니다. 8. heartbeat_age_min 이 device_group 의 heartbeat_timeout_min 보다 크면 verdict 는 에이전트 응답 끊김입니다. 9. module_type 이 sysext 이고 sysext_approved 가 거짓이며 approval_elapsed_hours 가 approval_grace_hours 보다 크면 verdict 는 시스템 확장 승인 기한을 넘김입니다. 10. 6~9번이 둘 이상 걸리면 6, 7, 8, 9번 차례로 하나만 남기고, 하나도 안 걸리면 verdict 는 보호 중입니다. 10-1. module_type 이 sysext 이고 sysext_approved 가 거짓인데 9번에 걸리지 않아 verdict 가 보호 중이면 awaiting_approval 은 true, 그 밖에는 false 입니다. 11. evidence 의 field 이름이 세 입력 표의 컬럼에 실재하는지 대조합니다. 12. agg 가 없는 evidence 의 value 가 수록된 행의 원문 값과 같은지 확인합니다. 13. summary 와 hedge 가 존댓말로 끝나는지 확인합니다. [기준과 같은 값과 빈 값] 기준과 같은 경과(MAC-0312 의 30분)는 넘은 것으로 보지 않습니다. 지원 상한과 주 버전이 같은 패치 버전(MAC-0266 의 13.7.2, 상한 13)은 범위 안입니다. 설치 뒤 응답이 없는 단말(MAC-0290)은 installed_at 부터 셉니다. 승인 기한 안에 있는 미승인 단말(MAC-0279, 설치 5시간)은 기한이 지나기 전까지 verdict 를 보호 중으로 두되, 키보드 보호는 아직 켜지지 않았으므로 awaiting_approval 을 true 로 두고 화면에서 승인 대기로 따로 표시합니다. [평가 러너 · 2주차] 단말 150대에 손으로 정답 판정을 매겨 자동 판정과 대조하고 판정별 일치율과 어긋난 단말 목록을 냅니다. [수동 검증 · 사람이 봅니다] 1. 지원 범위 밖으로 나온 시험 빌드가 실제로 배포 금지 대상인지 제품 담당자가 판단합니다. 2. 응답 끊김 단말 가운데 휴가·출장으로 꺼져 있던 단말을 보안 담당자가 골라 제외 규칙이 필요한지 봅니다.