잉카인터넷
경력근거: USB 저장장치뿐만 아니라 다양한 외부 매체 및 장치의 식별, 접근 제어, 정책 적용, 로그 수집 기능을 개발하며
※ 실제 산출물이 아닌 AI 예측 시안입니다.
잉카인터넷의 이번 자리는 외부 매체의 식별과 접근 제어, 정책 적용, 로그 수집을 한 솔루션 안에서 만들고 정책·장치 관리 화면까지 맡는 포지션입니다. 그래서 이 화면의 사용자는 잉카인터넷 개발자가 아니라 그 제품을 사서 쓰는 고객사 보안 담당자이고, 허용 목록과 쓰기 통제가 조직 단위로 나뉜 제품에서만 이런 판정이 성립합니다. 에이전트와 웹을 혼자 묶어 낸다는 대목도 이 화면에서 뜻을 가집니다. 정책을 등록하는 쪽과 기록을 판정하는 쪽이 같은 스키마 위에 서야 두 화면이 어긋나지 않기 때문입니다. 다만 이 포트폴리오는 정책판 선택과 허용 목록 대조, 그 결과를 읽는 화면을 보여줍니다. 커널 드라이버 수준의 장치 차단이나 Endpoint DLP 제품 운영의 전문성은 주장하지 않습니다. 정책판을 고르고 허용 목록을 푸는 데까지가 제가 짜 본 범위이고, 커널에서 장치를 실제로 막는 층은 잉카인터넷에서 배워야 하는 자리입니다.
이 공고의 주 포지션은 외부 매체를 식별하고 정책으로 막고 그 기록을 모으는 일을 한 솔루션 안에서 만드는 자리입니다. 모은 기록이 정책과 견줘지지 않으면 로그는 쌓이기만 하고 고객사 보안 담당자는 무엇이 정책 밖이었는지 보지 못합니다.
관리 프로그램과 정책·장치 관리 화면 개발이 주요업무에 함께 적혀 있고, 에이전트와 웹을 묶어 혼자 완성하는 자리라고 밝혔습니다. 정책을 등록하는 화면과 그 정책으로 기록을 판정하는 화면은 같은 사람이 이어서 만드는 물건입니다.
우대사항은 다섯 줄이고 앞 네 줄이 매체제어 제품, Endpoint DLP·DRM·EDR, USB Device Control 솔루션, 보안 USB 제품 경험입니다. 마지막 한 줄은 Claude 등 AI 개발 경험이라, 장치 허용 목록과 쓰기 통제를 데이터로 다뤄 본 결과물을 Claude 로 짜 본 기록이 그 다섯 줄에 함께 닿습니다.
에이전트가 남긴 매체 연결 기록과 조직별 허용 정책을 받아, 연결 시각에 실제로 돌고 있던 정책판을 먼저 고르고 그 판의 허용 목록과 견줍니다. 허용 목록은 시리얼과 제조사 코드가 쉼표로 이어진 한 칸이라 목록을 풀어 확인하고, 쓰기 기록은 그 판의 쓰기 허용 여부까지 봅니다. 지금 정책으로는 막히는데 옛 판 덕에 통과한 기록은 따로 세워, 보안 담당자가 조직별로 무엇을 먼저 손볼지 그 자리에서 정합니다.
사내 PC 의 외부 매체 사용을 관리하는 기업 보안 담당자
매체 연결 기록은 하루 수천 건씩 쌓이는데 조직 정책은 사람이 바꾸고 날짜마다 판이 다릅니다. 기록마다 그 시점의 정책판을 되살려 견주면 정책 밖 연결이 다섯 갈래로 나뉘고, 사고가 난 뒤가 아니라 그날 안에 유출 경로를 되짚습니다.
연결 기록과 조직 정책, 제조사 목록을 올리면 기록마다 다섯 판정 중 하나가 붙고 사유별로 나오는 관리자 페이지입니다. 기록은 에이전트가 이미 내보낸 표 형태를 받는다고 두고 시작하며, 커널 쪽 수집과 실시간 차단은 다루지 않습니다.
연결 기록 275건에 손으로 매긴 정답 판정을 붙여 자동 판정과 대조하고 사유별 일치율을 냅니다. 보안 담당자가 자기 조직 정책 파일을 올려 자기 기록으로 화면을 돌려 봅니다.
정책 행을 화면에서 고쳐 두고 과거 기록에 다시 돌려, 그 변경이 어떤 연결을 새로 막고 어떤 연결을 풀어 주는지 판정 차이를 세워 보여주는 단계입니다.
담당자가 연결 기록 표와 조직 정책 표를 올리면 정책 밖 사용이 사유별로 화면에 나오는 과정을 시연합니다.
연결 기록 275건에 정답 판정을 하나씩 달아 자동 판정과 맞춰 사유별 일치율을 냅니다. 기록도 정책도 작성자가 지어낸 표라, 이 값은 제품 성능이 아니라 정책 대조 규칙이 기록마다 같은 답을 내는지 확인한 숫자입니다.
연결 기록을 제대로 된 것만 넣지 않습니다. 어긋난 표 26가지를 먼저 올려 봅니다. 제조사 코드가 비어 있거나 허용 목록 칸이 통째로 빈 정책, 같은 조직에 적용 시작일이 같은 판이 둘 들어와도 화면이 서고, 판정이 서지 않는 기록은 hedge 로 내려갑니다.
기록 5만 건과 정책 300행을 한꺼번에 넣어 판정이 끝나는 시간을 재고, 하루치를 아침마다 돌릴 수 있는지 봅니다.
손에 쥔 수치는 연결 기록 275건의 사유별 일치율이 전부입니다. 일치율은 작성자가 꾸민 기록에 작성자가 매긴 정답을 붙여 나온 숫자이고, 유출 경로를 얼마나 빨리 되짚게 됐는지는 고객사 에이전트가 보낸 실기록과 그 회사의 정책 이력이 있어야 나옵니다. 실기록이 들어오는 날 바로 돌아가도록 채점 러너와 정답 기록 서식은 먼저 만들어 두었습니다.
연결 기록도 조직 정책도 제 손에서 나온 표라, 사유별 일치율은 고객사 에이전트가 보낸 실기록에서 이 판정이 얼마나 맞는지와는 아무 상관이 없습니다. 면접에서는 화면이 서는 범위와, 실기록이 오면 그날 다시 잰다는 준비 상태까지만 말씀드립니다.
기록을 지어낸 손과 정답을 매긴 손이 하나라 둘이 어긋날 까닭이 없습니다. 그래서 제조사 코드가 비어 있는 기록, 허용 시리얼 칸이 빈 정책, 복사 용량이 0인 쓰기 기록을 일부러 섞어 깨끗한 기록만 받아 주는 화면이 되지 않게 했습니다.
이 포트폴리오는 정책판 선택과 허용 목록 대조, 그 결과를 읽는 화면을 보여줍니다. 커널 드라이버 수준의 장치 차단이나 Endpoint DLP 제품 운영의 깊이는 주장하지 않습니다. 판정은 목록 대조와 날짜 비교가 하고 모델은 담당자가 읽을 문장만 씁니다.
옛 판으로 허용된 기록이 언제나 사고는 아닙니다. 정책을 일부러 좁힌 직후에는 이 갈래가 한꺼번에 늘어나므로, 판정을 확정이 아니라 담당자가 열어 볼 후보로 냅니다.
실제 제품의 정책은 조직 트리를 따라 상위 조직에서 내려오고 예외 승인도 따로 붙습니다. 여기서는 조직 한 단계와 판 이력만 다루므로, 상속과 예외 승인을 붙이는 일은 도입 단계 과제로 둡니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
에이전트가 남긴 매체 연결 기록입니다. 판정의 대상 표이며, 제조사 코드가 비어 있는 기록과 복사 용량이 0인 쓰기 기록을 담아 값이 모자란 채로도 판정이 서는 경로를 보여줍니다.
| event_id | host_id | org_unit | device_serial | vendor_id | action | plugged_at | copied_bytes | user_account |
|---|---|---|---|---|---|---|---|---|
| EV-55102 | PC-HR-0055 | 인사팀 | SN-TACHYON-SEC-0031 | 0951 | 연결 | 2026-09-21T09:04:00 | — | hr.kim |
| EV-55108 | PC-FIN-0092 | 재무팀 | SN-TACHYON-SEC-0044 | 0951 | 읽기 | 2026-09-21T09:41:00 | 2,380,000 | fin.park |
| EV-55120 | PC-RND-0417 | 연구소 | 4C530001220601101254 | 0781 | 연결 | 2026-09-21T10:22:00 | — | rnd.lee |
| EV-55133 | PC-RND-0418 | 연구소 | SN-TACHYON-SEC-0107 | 0951 | 쓰기 | 2026-09-21T11:03:00 | 512,000 | rnd.choi |
| EV-55151 | PC-SAL-0210 | 영업팀 | SN-TACHYON-SEC-0088 | 0951 | 쓰기 | 2026-09-21T13:15:00 | 0 | sal.jung |
아래 JSON Schema 에 맞는 매체 연결 기록 행을 더 만들어 주세요. {"type":"object","properties":{"event_id":{"type":"string"},"host_id":{"type":"string"},"org_unit":{"type":"string"},"device_serial":{"type":["string","null"]},"vendor_id":{"type":["string","null"]},"action":{"type":"string","enum":["연결","읽기","쓰기","해제"]},"plugged_at":{"type":"string"},"copied_bytes":{"type":["integer","null"],"minimum":0},"user_account":{"type":"string"}},"required":["event_id","host_id","org_unit","device_serial","vendor_id","action","plugged_at","copied_bytes","user_account"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) vendor_id 가 null 인 기록, (2) copied_bytes 가 0 인 쓰기 기록, (3) device_policy 에 없는 org_unit 의 기록, (4) plugged_at 이 몇 달 전인 기록. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"event_id":{"type":"string"},"host_id":{"type":"string"},"org_unit":{"type":"string"},"device_serial":{"type":["string","null"]},"vendor_id":{"type":["string","null"]},"action":{"type":"string","enum":["연결","읽기","쓰기","해제"]},"plugged_at":{"type":"string"},"copied_bytes":{"type":["integer","null"],"minimum":0},"user_account":{"type":"string"}},"required":["event_id","host_id","org_unit","device_serial","vendor_id","action","plugged_at","copied_bytes","user_account"]}조직마다 어떤 매체를 허용하고 쓰기를 여는지 적은 기준 표입니다. 같은 조직에 적용 시작일이 다른 판이 여럿 서 있고, 허용 시리얼 칸이 비어 있는 조직도 담았습니다.
| policy_no | org_unit | allowed_vendor_ids | allowed_serials | allow_write | effective_from | registered_by |
|---|---|---|---|---|---|---|
| POL-HR-01 | 인사팀 | 0951 | SN-TACHYON-SEC-0031,SN-TACHYON-SEC-0032 | true | 2026-06-01 | sec.admin1 |
| POL-FIN-01 | 재무팀 | 0951 | SN-TACHYON-SEC-0044,SN-TACHYON-SEC-0201 | true | 2026-06-01 | sec.admin1 |
| POL-FIN-02 | 재무팀 | 0951 | SN-TACHYON-SEC-0044,SN-TACHYON-SEC-0201 | false | 2026-09-01 | sec.admin2 |
| POL-RND-01 | 연구소 | 0951 | SN-TACHYON-SEC-0107,SN-TACHYON-SEC-0108 | true | 2026-06-01 | sec.admin1 |
| POL-SAL-01 | 영업팀 | 0951 | SN-TACHYON-SEC-0088,SN-TACHYON-SEC-0099 | true | 2026-06-01 | sec.admin1 |
아래 JSON Schema 에 맞는 조직 정책 행을 더 만들어 주세요. {"type":"object","properties":{"policy_no":{"type":"string"},"org_unit":{"type":"string"},"allowed_vendor_ids":{"type":["string","null"]},"allowed_serials":{"type":["string","null"]},"allow_write":{"type":"boolean"},"effective_from":{"type":"string"},"registered_by":{"type":"string"}},"required":["policy_no","org_unit","allowed_vendor_ids","allowed_serials","allow_write","effective_from","registered_by"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) allowed_serials 가 null 인 조직, (2) 같은 org_unit 에 effective_from 이 다른 판이 둘 이상, (3) allow_write 가 거짓인 조직, (4) 허용 목록에 코드가 하나만 적힌 조직. 허용 목록은 쉼표로 이어 적고, 생성한 행은 반드시 위 스키마를 통과해야 합니다.{"type":"object","properties":{"policy_no":{"type":"string"},"org_unit":{"type":"string"},"allowed_vendor_ids":{"type":["string","null"]},"allowed_serials":{"type":["string","null"]},"allow_write":{"type":"boolean"},"effective_from":{"type":"string"},"registered_by":{"type":"string"}},"required":["policy_no","org_unit","allowed_vendor_ids","allowed_serials","allow_write","effective_from","registered_by"]}제조사 코드마다 이름과 장치 구분을 적은 기준 표입니다. 걸린 기록을 담당자가 읽을 때 코드 대신 제조사 이름이 나오게 하는 자리입니다.
| vendor_id | vendor_name | device_class | registered_at |
|---|---|---|---|
| 0951 | Kingston | 저장장치 | 2026-01-12 |
| 0781 | SanDisk | 저장장치 | 2026-01-12 |
| 090C | Silicon Motion | 저장장치 | 2026-02-03 |
| 13FE | Phison | 저장장치 | 2026-02-03 |
| 0930 | Toshiba | 저장장치 | 2026-02-20 |
아래 JSON Schema 에 맞는 제조사 목록 행을 더 만들어 주세요. {"type":"object","properties":{"vendor_id":{"type":"string"},"vendor_name":{"type":"string"},"device_class":{"type":"string","enum":["저장장치","입력장치","촬영장치","통신장치"]},"registered_at":{"type":"string"}},"required":["vendor_id","vendor_name","device_class","registered_at"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 저장장치가 아닌 장치 구분, (2) 코드가 숫자로만 이뤄진 행과 영문이 섞인 행, (3) 이름이 서로 비슷해 사람이 헷갈리는 제조사 쌍. 생성한 행은 반드시 위 스키마를 통과해야 합니다.{"type":"object","properties":{"vendor_id":{"type":"string"},"vendor_name":{"type":"string"},"device_class":{"type":"string","enum":["저장장치","입력장치","촬영장치","통신장치"]},"registered_at":{"type":"string"}},"required":["vendor_id","vendor_name","device_class","registered_at"]}| C++ | 연결 기록을 표로 내보내는 수집기와 허용 목록 대조 규칙을 담는 언어입니다. 판정 순서와 목록 풀이가 여기 있습니다. |
| Windows Driver | 장치가 꽂히는 순간의 시리얼과 제조사 코드가 어디서 오는지 맞춰 두는 쪽입니다. 3주차에 수집기가 읽는 필드 이름을 이 층의 구조체와 같게 맞춥니다. |
| DeviceIoControl / IOCTL | 사용자 모드 수집기가 커널 쪽에서 장치 정보를 받아 오는 통로이며, 이 편에서는 받아 온 필드를 판정 입력 스키마로 옮기는 자리까지를 다룹니다. |
| Windows Service | 기록을 주기적으로 모아 판정기로 넘기는 상주 프로세스의 자리입니다. 3주차 재판정 실행을 여기에 겁니다. |
| MFC | 기존 관리 프로그램이 쓰는 정책 편집 화면의 필드 구성을 그대로 받아, 웹 화면의 정책 표와 같은 열 이름을 쓰게 맞춥니다. |
| TypeScript | 판정 결과의 필드 모양을 한 곳에 정의해 수집기 출력과 관리 화면이 같은 형태를 씁니다. |
| React | 사유별 목록과 기록 하나를 펼치는 상세, 조직 정책 표를 그리는 화면입니다. |
| LLM | 판정이 정해진 뒤 걸린 기록을 보안 담당자가 보고서에 옮겨 적을 한 문장으로 바꿉니다. |
| Claude | 그 한 문장을 쓰는 모델이고, 개발 중에는 수집기와 판정 규칙의 초안을 짜는 CLI 도구로도 씁니다. |
| OpenAI | 같은 문장을 다른 모델로도 받아 두 결과가 같은 근거 필드만 인용하는지 견주는 비교용 자리입니다. |
✗ fail → 두 판정이 겹치는 기록이 10건을 넘으면 판정 차례를 다시 정하고 겹치는 조건을 규칙 표로 뽑아 둡니다.
✓ pass → 2주차 정답 대조와 담당자 시연으로 넘어갑니다.
✗ fail → 어긋난 자리를 모아 시점 정책 선택 기준과 허용 목록 풀이 방식을 다시 봅니다.
✓ pass → 3주차 정책 변경 미리 보기로 넘어갑니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · event_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
정책 안정책 안등록 안 된 장치미등록 장치쓰기 금지인데 기록됨쓰기 금지 위반정책이 없는 조직조직 정책 없음지난 정책으로 허용됨옛 정책 적용연결 기록 한 건이 그 시점의 조직 정책과 견줘 어떤 판정을 받는지 남기는 형식입니다. 판정은 규칙이 정하고 담당자가 읽을 한 문장만 모델이 씁니다.
{"type":"object","properties":{"event_id":{"type":"string"},"host_id":{"type":"string"},"org_unit":{"type":"string"},"verdict":{"type":"string","enum":["정책 안","등록 안 된 장치","쓰기 금지인데 기록됨","정책이 없는 조직","지난 정책으로 허용됨"]},"applied_policy_no":{"type":["string","null"],"description":"plugged_at 이하의 effective_from 가운데 가장 나중인 device_policy 행의 policy_no 입니다. 그 조직 행이 하나도 없으면 비웁니다."},"current_policy_no":{"type":["string","null"],"description":"그 조직의 device_policy 행 중 effective_from 이 가장 나중인 행의 policy_no 입니다. 이 값이 applied_policy_no 와 다르면 옛 판으로 허용된 기록입니다."},"matched_by":{"type":["string","null"],"description":"허용으로 본 근거가 allowed_serials 인지 allowed_vendor_ids 인지 적습니다. 허용이 아니면 비웁니다."},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{}},"required":["field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["event_id","org_unit","verdict","applied_policy_no","evidence","summary"]}[
{
"event_id": "EV-55120",
"host_id": "PC-RND-0417",
"org_unit": "연구소",
"verdict": "등록 안 된 장치",
"applied_policy_no": "POL-RND-01",
"current_policy_no": "POL-RND-01",
"matched_by": null,
"evidence": [
{
"field": "event_id",
"value": "EV-55120"
},
{
"field": "device_serial",
"value": "4C530001220601101254"
},
{
"field": "vendor_id",
"value": "0781"
},
{
"field": "allowed_vendor_ids",
"value": "0951"
},
{
"field": "vendor_name",
"value": "SanDisk"
}
],
"summary": "연구소 PC-RND-0417 에 꽂힌 SanDisk 저장장치는 시리얼도 제조사 코드도 연구소 허용 목록에 서 있지 않습니다.",
"hedge": null
},
{
"event_id": "EV-55188",
"host_id": "PC-FIN-0092",
"org_unit": "재무팀",
"verdict": "쓰기 금지인데 기록됨",
"applied_policy_no": "POL-FIN-02",
"current_policy_no": "POL-FIN-02",
"matched_by": "시리얼",
"evidence": [
{
"field": "event_id",
"value": "EV-55188"
},
{
"field": "action",
"value": "쓰기"
},
{
"field": "copied_bytes",
"value": 12400000
},
{
"field": "allow_write",
"value": false
},
{
"field": "effective_from",
"value": "2026-09-01"
}
],
"summary": "재무팀은 9월 1일부터 쓰기를 막아 두었는데 PC-FIN-0092 에서 12.4MB 가 보안USB 로 복사됐습니다.",
"hedge": null
},
{
"event_id": "EV-55201",
"host_id": "PC-NEW-0003",
"org_unit": "신설팀",
"verdict": "정책이 없는 조직",
"applied_policy_no": null,
"current_policy_no": null,
"matched_by": null,
"evidence": [
{
"field": "event_id",
"value": "EV-55201"
},
{
"field": "org_unit",
"value": "신설팀"
},
{
"field": "host_id",
"value": "PC-NEW-0003"
},
{
"field": "policy_no",
"agg": "count",
"value": 0
}
],
"summary": "신설팀에는 정책 행이 하나도 없어 PC-NEW-0003 의 연결을 허용으로도 차단으로도 보지 못합니다.",
"hedge": "조직이 새로 생기면 정책이 붙기 전까지 이 상태가 이어지므로, 담당자가 조직 정책을 먼저 등록해야 판정이 섭니다."
},
{
"event_id": "EV-55240",
"host_id": "PC-DEV-0311",
"org_unit": "개발팀",
"verdict": "지난 정책으로 허용됨",
"applied_policy_no": "POL-DEV-01",
"current_policy_no": "POL-DEV-02",
"matched_by": "제조사",
"evidence": [
{
"field": "event_id",
"value": "EV-55240"
},
{
"field": "plugged_at",
"value": "2026-09-05T16:30:00"
},
{
"field": "effective_from",
"value": "2026-09-10"
},
{
"field": "allowed_vendor_ids",
"value": "0951,13FE"
},
{
"field": "vendor_id",
"value": "13FE"
}
],
"summary": "개발팀 파트너 장치는 9월 10일 정책에서 빠졌는데 연결 시각이 9월 5일이라 그 앞 판으로 허용된 기록입니다.",
"hedge": "지금 같은 장치를 꽂으면 막히므로, 이 기록은 사고가 아니라 정책이 바뀐 자리를 되짚는 근거로 읽습니다."
},
{
"event_id": "EV-55266",
"host_id": "PC-HR-0055",
"org_unit": "인사팀",
"verdict": "정책 안",
"applied_policy_no": "POL-HR-01",
"current_policy_no": "POL-HR-01",
"matched_by": "시리얼",
"evidence": [
{
"field": "event_id",
"value": "EV-55266"
},
{
"field": "device_serial",
"value": "SN-TACHYON-SEC-0031"
},
{
"field": "allowed_serials",
"value": "SN-TACHYON-SEC-0031,SN-TACHYON-SEC-0032"
},
{
"field": "allow_write",
"value": true
},
{
"field": "copied_bytes",
"value": 3100000
}
],
"summary": "인사팀 보안USB 는 허용 시리얼 목록에 있고 인사팀 정책이 쓰기를 열어 두어 정책 안입니다.",
"hedge": null
},
{
"event_id": "EV-55214",
"host_id": "PC-SAL-0211",
"org_unit": "영업팀",
"verdict": "정책 안",
"applied_policy_no": "POL-SAL-01",
"current_policy_no": "POL-SAL-01",
"matched_by": "시리얼",
"evidence": [
{
"field": "event_id",
"value": "EV-55214"
},
{
"field": "device_serial",
"value": "SN-TACHYON-SEC-0099"
},
{
"field": "vendor_id",
"value": null
},
{
"field": "allowed_serials",
"value": "SN-TACHYON-SEC-0088,SN-TACHYON-SEC-0099"
}
],
"summary": "영업팀 PC-SAL-0211 의 장치는 허용 시리얼로 확인돼 정책 안으로 섭니다.",
"hedge": "제조사 코드가 비어 있어 제조사 허용 목록 쪽은 견주지 못했고 시리얼만으로 허용을 봤습니다."
},
{
"event_id": "EV-55151",
"host_id": "PC-SAL-0210",
"org_unit": "영업팀",
"verdict": "정책 안",
"applied_policy_no": "POL-SAL-01",
"current_policy_no": "POL-SAL-01",
"matched_by": "시리얼",
"evidence": [
{
"field": "event_id",
"value": "EV-55151"
},
{
"field": "action",
"value": "쓰기"
},
{
"field": "copied_bytes",
"value": 0
},
{
"field": "allow_write",
"value": true
}
],
"summary": "영업팀은 쓰기를 열어 둔 조직이라 PC-SAL-0210 의 복사 기록은 정책 안입니다.",
"hedge": "복사 용량이 0이라 파일이 실제로 나갔는지는 이 기록만으로 정해지지 않습니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 다섯 값 중 하나인지 확인합니다. 규칙이 정한 값이라 모델이 새 값을 지어내면 그 응답을 버립니다. 2. event_id·org_unit·verdict·applied_policy_no·evidence·summary 필드가 빠짐없이 존재하는지 확인합니다. 3. copied_bytes 가 0 이상인지 확인합니다. 4. 정책이 없는 조직은 그 org_unit 이 device_policy.org_unit 어디에도 없는지 다시 계산합니다. 5. 적용 정책은 plugged_at 이하의 effective_from 가운데 가장 나중인 행으로 다시 고르고, 지금 정책은 그 조직에서 effective_from 이 가장 나중인 행으로 다시 고릅니다. 6. 등록 안 된 장치는 적용 정책의 allowed_serials 를 쉼표로 풀어 device_serial 이 그 안에 없고, allowed_vendor_ids 를 풀어 vendor_id 도 그 안에 없는지 다시 계산합니다. 허용 목록 칸이 비어 있으면 그 칸으로는 허용을 주지 않습니다. 7. 쓰기 금지인데 기록됨은 action 이 쓰기이고 적용 정책의 allow_write 가 거짓인지 다시 계산합니다. 다만 읽기와 연결 기록은 allow_write 와 무관하므로 이 판정 대상이 아닙니다. 8. 지난 정책으로 허용됨은 적용 정책으로는 허용인데 지금 정책의 허용 목록으로는 허용이 아니고, 두 policy_no 가 서로 다른지 다시 계산합니다. 9. 사유가 둘 이상 걸리면 정책이 없는 조직, 등록 안 된 장치, 쓰기 금지인데 기록됨, 지난 정책으로 허용됨 차례로 하나만 남기고 하나도 안 걸리면 정책 안을 답니다. 허용 목록에 없는 장치로 쓰기까지 한 기록은 6번과 7번이 같이 서는데, 이 차례에 따라 등록 안 된 장치만 남습니다. 10. evidence 의 field 이름이 입력에 있는 컬럼인지 대조합니다. 없는 이름을 인용하면 요약이 지어낸 문장이라는 뜻이라 규칙이 만든 기본 문장으로 되돌립니다. 11. evidence 의 value 가 수록된 행의 원문 값과 같은지 확인합니다. 여러 행을 세어 얻은 수치는 agg 를 함께 적습니다. 12. vendor_id 가 비어 있는 기록은 제조사 허용 목록 쪽 확인을 건너뛰고 그 사실을 hedge 에 적었는지 확인합니다. 13. summary 가 존댓말 한 문장으로 끝나는지 확인합니다. [평가 러너 · 2주차] 손으로 매긴 정답 판정 275건과 자동 판정을 대조해 사유별 일치율을 내고, 어긋난 자리는 따로 모아 판정 차례를 다시 정할지 봅니다. 정책 판을 무작위로 갈아 끼운 기록을 만들어 옛 판 허용을 몇 건 심었고 몇 건 잡았는지 견주는 일도 이 러너에서 합니다. [수동 검증 · 사람이 봅니다] 1. 지난 정책으로 허용됨으로 걸린 기록 20건을 열어 정책을 좁힌 직후의 정상 기록인지 담당자가 판단합니다. 2. 쓰기 금지인데 기록됨으로 걸린 기록 중 예외 승인을 받은 자리가 있는지 보고 판정 차례를 다시 봅니다.