Skip to Content

API ๋ ˆํผ๋Ÿฐ์Šค

์‹œ์Šคํ…œ ๋‚ด๋ถ€ REST API์™€ KPIS OpenAPI ์—ฐ๋™ ๊ตฌ์กฐ, ์ธ์ฆ ๋ฐฉ์‹, ๊ณต๋™์ธ์ฆ์„œ ๊ด€๋ฆฌ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

KPIS API ๋ถ„๋ฅ˜

KPIS OpenAPI๋Š” ๊ธฐ๋Šฅ์— ๋”ฐ๋ผ ์กฐํšŒ์™€ ๋“ฑ๋ก ๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋‰˜๋ฉฐ, ์ธ์ฆ ๋ฐฉ์‹์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์กฐํšŒ API (MA101MA110, MA117MA118)

๋งˆ์Šคํ„ฐ ๋ฐ์ดํ„ฐ์™€ ๋“ฑ๋ก ๊ฒฐ๊ณผ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฝ๊ธฐ ์ „์šฉ API์ž…๋‹ˆ๋‹ค.

ID์—”๋“œํฌ์ธํŠธ์„ค๋ช…
MA101getMsupStdCdInfo.doํ‘œ์ค€์ฝ”๋“œ๋งˆ์Šคํ„ฐ ์ •๋ณด ์กฐํšŒ
MA102getMsupBscqInfo.do๊ฑฐ๋ž˜์ฒ˜ ์ •๋ณด ์กฐํšŒ
MA103getMsupRfidInfo.doRFID Tag ์ •๋ณด ์กฐํšŒ
MA104getMsupBnoInfo.do๋ฐ”์ฝ”๋“œ๋ฒˆํ˜ธ(์ตœ์†Œ๋ฒˆํ˜ธ) ์กฐํšŒ
MA105getMsupSnoInfo.do๋ฐ”์ฝ”๋“œ๋ฒˆํ˜ธ(์ผ๋ จ๋ฒˆํ˜ธ) ์กฐํšŒ
MA106getMsupSnoDtlInfo.do๋ฐ”์ฝ”๋“œ๋ฒˆํ˜ธ(์ผ๋ จ๋ฒˆํ˜ธ ์ƒ์„ธ) ์กฐํšŒ
MA107getMsupRfidMultiInfo.do๋‹ค๊ฑด RFID tag ์ •๋ณด ์กฐํšŒ
MA109getRiskMsupInfo.doํšŒ์ˆ˜์˜์•ฝํ’ˆ ๋ฐ˜์†ก๋งˆ์Šคํ„ฐ(EB) ์ •๋ณด ์กฐํšŒ
MA110getMsupBriefSummary01Info.do๊ณต๊ธ‰๋‚ด์—ญ ์ •๋ณด ์กฐํšŒ
MA117getMsupNtfcItemInq.do์˜์•ฝํ’ˆ๊ด€๋ จ ์ƒ์„ธ์ •๋ณด ์กฐํšŒ
MA118getMsupStdCdChgHstInfo.doํ‘œ์ค€์ฝ”๋“œ ๋ณ€๊ฒฝ์ด๋ ฅ ์กฐํšŒ(์ „์ฒด)

๋“ฑ๋ก API (MA111~MA116, MA119)

๊ณต๊ธ‰๋‚ด์—ญ ์ œ์ถœ, ๋ฐ˜์†ก์‹ ์ฒญ, ์ž…๊ณ ๋‚ด์—ญ ์กฐํšŒ ๋“ฑ ์—…๋ฌด ์ฒ˜๋ฆฌ API์ž…๋‹ˆ๋‹ค.

ID์—”๋“œํฌ์ธํŠธ์„ค๋ช…
MA111regMsupSplyDtlDrt๊ณต๊ธ‰๋‚ด์—ญ ์ •๋ณด ์ง์ ‘ ๋“ฑ๋ก
MA112getMsupSplyDtlRgstResult๊ณต๊ธ‰๋‚ด์—ญ ๋“ฑ๋ก ๊ฒฐ๊ณผ ์กฐํšŒ
MA113regRpayMsupCmmDrt๋ฐ˜์†ก์‹ ์ฒญ ์ง์ ‘ ๋“ฑ๋ก
MA114getRpayMsupCmmRgstResult๋ฐ˜์†ก์š”์ฒญ ๋“ฑ๋ก ๊ฒฐ๊ณผ ์กฐํšŒ
MA115getMsupWrhsDtlInfo์ž…๊ณ ๋‚ด์—ญ ์ •๋ณด ์กฐํšŒ(ํŽ˜์ด์ง€)
MA116getMsupQrtrRptPrdInfo๋ถ„๊ธฐ๋ณ„ ๋ณด๊ณ ๊ธฐ๊ฐ„ ์กฐํšŒ
MA119getMsupWrhsDtlListInfo์ž…๊ณ ๋‚ด์—ญ ์ •๋ณด ์กฐํšŒ(๋ชฉ๋ก)

ํ•ต์‹ฌ ์—…๋ฌด ํ๋ฆ„

MA116 ๋ณด๊ณ ๊ธฐ๊ฐ„ ์กฐํšŒ โ†’ MA101 ํ‘œ์ค€์ฝ”๋“œ ๊ฒ€์ฆ โ†’ MA111 ๊ณต๊ธ‰๋‚ด์—ญ ๋“ฑ๋ก โ†’ MA112 ๊ฒฐ๊ณผ ์กฐํšŒ โ†’ (๋ฐ˜์†ก ์‹œ) MA113 ๋ฐ˜์†ก์‹ ์ฒญ โ†’ MA114 ๊ฒฐ๊ณผ ์กฐํšŒ

์ธ์ฆ ์ด์›ํ™”

KPIS API๋Š” ํ˜ธ์ถœ ์œ ํ˜•์— ๋”ฐ๋ผ ์ธ์ฆ ๋ฐฉ์‹์ด ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

API KEY ์ธ์ฆ (์กฐํšŒ)

์กฐํšŒ API๋Š” ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์— apiKey์™€ aplHbin(์‚ฌ์—…์ž๋“ฑ๋ก๋ฒˆํ˜ธ)์„ ํฌํ•จํ•˜์—ฌ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ์„ค๋ช…
๋Œ€์ƒ APIMA101MA110, MA117MA118
์ธ์ฆ ๋ฐฉ์‹REST ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ (apiKey + aplHbin)
ํ”„๋ก์‹œ ๊ฒฝ๋กœserver/routes/kpisProxy.ts
์„ค์ • ์œ„์น˜๊ด€๋ฆฌ์ž > API ์„ค์ • ํŒจ๋„

JWT + ๊ณต๋™์ธ์ฆ์„œ (๋“ฑ๋ก)

๋“ฑ๋ก API๋Š” ์„œ๋ฒ„์—์„œ JWT ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›๊ณ , ๊ณต๋™์ธ์ฆ์„œ๋กœ SOAP ๋ฉ”์‹œ์ง€์— ์ „์ž์„œ๋ช…ํ•˜์—ฌ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ์„ค๋ช…
๋Œ€์ƒ APIMA111~MA116, MA119
์ธ์ฆ ๋ฐฉ์‹JWT(Authorization: Bearer) + WS-Security ์ „์ž์„œ๋ช…
ํ”„๋ก์‹œ ๊ฒฝ๋กœserver/routes/kpisJwtProxy.ts
์„œ๋ช… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌnode-forge (RSA-SHA256)

JWT ๋ฐœ๊ธ‰ ๊ณผ์ •

  1. ์„œ๋ฒ„ ํ™˜๊ฒฝ๋ณ€์ˆ˜์˜ CLIENT_ID/CLIENT_SECRET์œผ๋กœ KPIS ์ธ์ฆ ์„œ๋ฒ„์— ํ† ํฐ ์š”์ฒญ
  2. ๋ฐœ๊ธ‰๋œ JWT๋ฅผ Authorization: Bearer {jwt} ํ—ค๋”์— ํฌํ•จ
  3. ํ† ํฐ์€ DB(jwt_tokens ํ…Œ์ด๋ธ”)์— ์บ์‹ฑํ•˜์—ฌ ์žฌ์‚ฌ์šฉ
  4. ๋งŒ๋ฃŒ ์‹œ ์ž๋™ ์žฌ๋ฐœ๊ธ‰

JWT ์ž๊ฒฉ ์ฆ๋ช…์€ ์„œ๋ฒ„ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ๋งŒ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์— ์ ˆ๋Œ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณต๋™์ธ์ฆ์„œ ๊ด€๋ฆฌ

MA111~MA116 ๋“ฑ๋ก API ํ˜ธ์ถœ ์‹œ ํ•„์ˆ˜์ธ ๊ณต๋™์ธ์ฆ์„œ(.pfx)์˜ ๊ด€๋ฆฌ ์ ˆ์ฐจ์ž…๋‹ˆ๋‹ค.

์ธ์ฆ์„œ ์—…๋กœ๋“œ

๊ด€๋ฆฌ์ž(admin ์—ญํ• )๋งŒ ์ธ์ฆ์„œ๋ฅผ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ด€๋ฆฌ์ž > ์ธ์ฆ์„œ ๊ด€๋ฆฌ ๋ฉ”๋‰ด์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.
  2. .pfx ํŒŒ์ผ์„ ์„ ํƒํ•˜๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  3. ์—…๋กœ๋“œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. ์„œ๋ฒ„๊ฐ€ ์ธ์ฆ์„œ๋ฅผ AES-256-CBC๋กœ ์•”ํ˜ธํ™”ํ•˜์—ฌ DB(cert_config)์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ์„œ ์ •๋ณด ํ™•์ธ

์—…๋กœ๋“œ๋œ ์ธ์ฆ์„œ์˜ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ์„ค๋ช…
์ฃผ์ฒด(Subject CN)์ธ์ฆ์„œ ์†Œ์œ ์ž
๋ฐœ๊ธ‰์ž(Issuer CN)์ธ์ฆ๊ธฐ๊ด€
์œ ํšจ๊ธฐ๊ฐ„(Valid From ~ To)์ธ์ฆ์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๊ธฐ๊ฐ„
์ผ๋ จ๋ฒˆํ˜ธ(Serial)์ธ์ฆ์„œ ๊ณ ์œ  ์‹๋ณ„์ž
์—…๋กœ๋“œ ์ผ์‹œ์„œ๋ฒ„์— ๋“ฑ๋กํ•œ ์‹œ๊ฐ

๋งŒ๋ฃŒ ์•Œ๋ฆผ

์ธ์ฆ์„œ ๋งŒ๋ฃŒ ์ž„๋ฐ• ์‹œ ๋‹จ๊ณ„๋ณ„๋กœ ์•Œ๋ฆผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ƒํƒœ์กฐ๊ฑดUI ํ‘œ์‹œ
ok๋งŒ๋ฃŒ์ผ 31์ผ ์ด์ƒ ๋‚จ์Œ์ดˆ๋ก์ƒ‰ ๋ฐฐ์ง€
warn-30๋งŒ๋ฃŒ 30์ผ ์ดํ•˜๋…ธ๋ž€์ƒ‰ ๋ฐฐ์ง€
warn-7๋งŒ๋ฃŒ 7์ผ ์ดํ•˜์ฃผํ™ฉ์ƒ‰ ๋ฐฐ์ง€ + toast ๊ฒฝ๊ณ 
warn-1๋งŒ๋ฃŒ 1์ผ ์ดํ•˜๋นจ๊ฐ„์ƒ‰ ๋ฐฐ์ง€ + toast ๊ธด๊ธ‰
expired๋งŒ๋ฃŒ๋จ๋นจ๊ฐ„์ƒ‰ ๋ฐฐ์ง€ + ์ „์†ก ๋ฒ„ํŠผ ๋น„ํ™œ์„ฑํ™”

์ธ์ฆ์„œ ๋งŒ๋ฃŒ๋Š” KPIS ์ž๋™๋ณด๊ณ  ๊ธฐ๋Šฅ์˜ ์ฆ‰์‹œ ์ค‘๋‹จ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. D-30๋ถ€ํ„ฐ ๊ฐฑ์‹ ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๋‚ด๋ถ€ ์—”๋“œํฌ์ธํŠธ

์‹œ์Šคํ…œ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” REST API ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

๋‚ ์งœ๋ณ„ ๋ณด๊ณ  ๊ด€๋ฆฌ (/api/gap-data)

Method์—”๋“œํฌ์ธํŠธ์„ค๋ช…
GET/api/gap-data/calendar๋ณด๊ณ  ์ƒํƒœ ๋‹ฌ๋ ฅ (?from=YYYY-MM-DD&to=YYYY-MM-DD)
GET/api/gap-data/:date๋‚ ์งœ๋ณ„ ๊ฐ‘์ง€/์„์ง€ ๋ฐ์ดํ„ฐ ์กฐํšŒ
POST/api/gap-data/upload๊ฐ‘์ง€/์„์ง€ ํŒŒ์ผ ์—…๋กœ๋“œ (multipart)
PUT/api/gap-data/:date/flush๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ DB์— ๋™๊ธฐํ™”
PUT/api/gap-data/:date/receipt์ ‘์ˆ˜๋ฒˆํ˜ธ ๋ฐฐ์น˜ ์—…๋ฐ์ดํŠธ
PUT/api/gap-data/:date/error์ œ์ถœ ์‹คํŒจ ๊ธฐ๋ก
POST/api/gap-data/ignore๋‚ ์งœ๋ณ„ ๋ฏธ๋ณด๊ณ  ๋ฌด์‹œ ๋“ฑ๋ก
DELETE/api/gap-data/ignore/:date๋ฏธ๋ณด๊ณ  ๋ฌด์‹œ ํ•ด์ œ

ํ‘œ์ค€์ฝ”๋“œ (/api/standard-codes)

Method์—”๋“œํฌ์ธํŠธ์„ค๋ช…
GET/api/standard-codes/count๋งˆ์Šคํ„ฐ ๊ฑด์ˆ˜ (๋ฐ”์ฝ”๋“œ/์—‘์…€๋ณ„ ๊ตฌ๋ถ„)
GET/api/standard-codes/searchํ‘œ์ค€์ฝ”๋“œ ๊ฒ€์ƒ‰ (?keyword=..., ์ตœ๋Œ€ 10๊ฑด)
GET/api/standard-codes/:stdCd13์ž๋ฆฌ ์ฝ”๋“œ๋กœ ์ •ํ™• ์กฐํšŒ

๊ฒ€์ƒ‰ 3๋‹จ๊ณ„: ์ •ํ™• ์ผ์น˜ โ†’ LIKE โ†’ FTS5 ์ „๋ฌธ ๊ฒ€์ƒ‰ ์ˆœ์„œ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๋งคํ•‘ (/api/code-mappings)

Method์—”๋“œํฌ์ธํŠธ์„ค๋ช…
GET/api/code-mappings์ „์ฒด ๋˜๋Š” ํƒญ๋ณ„ ์กฐํšŒ (?supplyType=1)
POST/api/code-mappings์ œํ’ˆ๋ช…-ํ‘œ์ค€์ฝ”๋“œ ๋งคํ•‘ ์ €์žฅ
DELETE/api/code-mappings/:productName/:standardCode๋งคํ•‘ ์‚ญ์ œ
GET/api/code-mappings/:productNameํŠน์ • ์ œํ’ˆ์˜ ์ตœ๊ทผ ๋งคํ•‘ ์กฐํšŒ

์‚ฌ์šฉ์ž ๊ด€๋ฆฌ (/api/users)

Method์—”๋“œํฌ์ธํŠธ๊ถŒํ•œ์„ค๋ช…
GET/api/usersadmin์ „์ฒด ์‚ฌ์šฉ์ž ๋ชฉ๋ก
PATCH/api/users/:userId/approveadmin์‚ฌ์šฉ์ž ์Šน์ธ
PATCH/api/users/:userId/roleadmin์—ญํ•  ๋ณ€๊ฒฝ (admin / user)

์ธ์ฆ์„œ ๊ด€๋ฆฌ (/api/cert-config)

Method์—”๋“œํฌ์ธํŠธ๊ถŒํ•œ์„ค๋ช…
GET/api/cert-config/meta๋กœ๊ทธ์ธ์ธ์ฆ์„œ ์ฃผ์ฒด/๋งŒ๋ฃŒ์ผ/์ƒํƒœ
POST/api/cert-config/uploadadmin.pfx + ๋น„๋ฐ€๋ฒˆํ˜ธ ์—…๋กœ๋“œ
DELETE/api/cert-configadmin์ธ์ฆ์„œ ์‚ญ์ œ
POST/api/kpis/soap๋กœ๊ทธ์ธSOAP ํ”„๋ก์‹œ (์„œ๋ช… ํ›„ ์ „์†ก)

Rate Limiting ์ •์ฑ…

KPIS API ๊ณผ๋„ํ•œ ํ˜ธ์ถœ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„์— Rate Limiting์ด ์ ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ์„ค๋ช…
์ ์šฉ ๋ฒ”์œ„๋ชจ๋“  /api/* ์—”๋“œํฌ์ธํŠธ
์ œํ•œ ๋ฐฉ์‹express-rate-limit (IP ๊ธฐ๋ฐ˜)
ํ…Œ๋„ŒํŠธ ๋‹จ์œ„ํŠน์ • ํ…Œ๋„ŒํŠธ์˜ ๊ณผ๋„ํ•œ ํ˜ธ์ถœ์ด ์ „์ฒด ์‹œ์Šคํ…œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ๊ฒฉ๋ฆฌ
์žฌ์‹œ๋„ํ˜ธ์ถœ ๊ฐ„๊ฒฉ๊ณผ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์ œํ•œํ•˜์—ฌ KPIS ์„œ๋ฒ„ ๋ถ€ํ•˜ ๋ฐฉ์ง€

Rate Limit ์ดˆ๊ณผ ์‹œ 429 Too Many Requests ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ž ์‹œ ํ›„ ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.

ํ…Œ๋„ŒํŠธ๋ณ„ API ํ‚ค ๊ด€๋ฆฌ

๊ณ ๊ฐ์‚ฌ(ํ…Œ๋„ŒํŠธ)๋งˆ๋‹ค ๋ณ„๋„์˜ KPIS API ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ์„ค๋ช…
API KEYํ…Œ๋„ŒํŠธ ์„ค์ •์—์„œ ๊ด€๋ฆฌ, ํ•˜๋“œ์ฝ”๋”ฉ ๊ธˆ์ง€
์‚ฌ์—…์ž๋“ฑ๋ก๋ฒˆํ˜ธ (aplHbin)ํ…Œ๋„ŒํŠธ๋ณ„ ์‚ฌ์—…์ž ์ •๋ณด
JWT ์ž๊ฒฉ ์ฆ๋ช…CLIENT_ID/CLIENT_SECRET โ€” ์„œ๋ฒ„ ํ™˜๊ฒฝ๋ณ€์ˆ˜
์ธ์ฆ์„œํ…Œ๋„ŒํŠธ๋ณ„ .pfx ํŒŒ์ผ โ€” DB ์•”ํ˜ธํ™” ์ €์žฅ

API ์„ค์ • ๋ณ€๊ฒฝ

  1. ๊ด€๋ฆฌ์ž > API ์„ค์ • ๋ฉ”๋‰ด์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฌ์—…์ž๋“ฑ๋ก๋ฒˆํ˜ธ์™€ API KEY๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  3. API KEY๋Š” BASE64 ์•”ํ˜ธํ™”๋˜์–ด DB(api_config)์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  4. ์ €์žฅ ํ›„ ์กฐํšŒ API(MA101 ๋“ฑ)๊ฐ€ ์ฆ‰์‹œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

KPIS API ํ™˜๊ฒฝ

ํ™˜๊ฒฝURL์šฉ๋„
๊ฐœ๋ฐœhttp://devopenapi.kpis.or.krํ…Œ์ŠคํŠธ/๊ฐœ๋ฐœ
์šด์˜https://newopenapi.kpis.or.kr์‹ค์ œ ๋ณด๊ณ 

์šด์˜ ํ™˜๊ฒฝ์€ Oracle Cloud ์„œ๋ฒ„์˜ Floating IP๊ฐ€ KPIS ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— ๋“ฑ๋ก๋˜์–ด ์žˆ์–ด์•ผ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„