API ๋ ํผ๋ฐ์ค
์์คํ ๋ด๋ถ REST API์ KPIS OpenAPI ์ฐ๋ ๊ตฌ์กฐ, ์ธ์ฆ ๋ฐฉ์, ๊ณต๋์ธ์ฆ์ ๊ด๋ฆฌ๋ฅผ ์ค๋ช ํฉ๋๋ค.
KPIS API ๋ถ๋ฅ
KPIS OpenAPI๋ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ์กฐํ์ ๋ฑ๋ก ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋๋ฉฐ, ์ธ์ฆ ๋ฐฉ์์ด ๋ค๋ฆ ๋๋ค.
์กฐํ API (MA101MA110, MA117MA118)
๋ง์คํฐ ๋ฐ์ดํฐ์ ๋ฑ๋ก ๊ฒฐ๊ณผ๋ฅผ ์กฐํํ๋ ์ฝ๊ธฐ ์ ์ฉ API์ ๋๋ค.
| ID | ์๋ํฌ์ธํธ | ์ค๋ช |
|---|---|---|
| MA101 | getMsupStdCdInfo.do | ํ์ค์ฝ๋๋ง์คํฐ ์ ๋ณด ์กฐํ |
| MA102 | getMsupBscqInfo.do | ๊ฑฐ๋์ฒ ์ ๋ณด ์กฐํ |
| MA103 | getMsupRfidInfo.do | RFID Tag ์ ๋ณด ์กฐํ |
| MA104 | getMsupBnoInfo.do | ๋ฐ์ฝ๋๋ฒํธ(์ต์๋ฒํธ) ์กฐํ |
| MA105 | getMsupSnoInfo.do | ๋ฐ์ฝ๋๋ฒํธ(์ผ๋ จ๋ฒํธ) ์กฐํ |
| MA106 | getMsupSnoDtlInfo.do | ๋ฐ์ฝ๋๋ฒํธ(์ผ๋ จ๋ฒํธ ์์ธ) ์กฐํ |
| MA107 | getMsupRfidMultiInfo.do | ๋ค๊ฑด RFID tag ์ ๋ณด ์กฐํ |
| MA109 | getRiskMsupInfo.do | ํ์์์ฝํ ๋ฐ์ก๋ง์คํฐ(EB) ์ ๋ณด ์กฐํ |
| MA110 | getMsupBriefSummary01Info.do | ๊ณต๊ธ๋ด์ญ ์ ๋ณด ์กฐํ |
| MA117 | getMsupNtfcItemInq.do | ์์ฝํ๊ด๋ จ ์์ธ์ ๋ณด ์กฐํ |
| MA118 | getMsupStdCdChgHstInfo.do | ํ์ค์ฝ๋ ๋ณ๊ฒฝ์ด๋ ฅ ์กฐํ(์ ์ฒด) |
๋ฑ๋ก API (MA111~MA116, MA119)
๊ณต๊ธ๋ด์ญ ์ ์ถ, ๋ฐ์ก์ ์ฒญ, ์ ๊ณ ๋ด์ญ ์กฐํ ๋ฑ ์ ๋ฌด ์ฒ๋ฆฌ API์ ๋๋ค.
| ID | ์๋ํฌ์ธํธ | ์ค๋ช |
|---|---|---|
| MA111 | regMsupSplyDtlDrt | ๊ณต๊ธ๋ด์ญ ์ ๋ณด ์ง์ ๋ฑ๋ก |
| MA112 | getMsupSplyDtlRgstResult | ๊ณต๊ธ๋ด์ญ ๋ฑ๋ก ๊ฒฐ๊ณผ ์กฐํ |
| MA113 | regRpayMsupCmmDrt | ๋ฐ์ก์ ์ฒญ ์ง์ ๋ฑ๋ก |
| MA114 | getRpayMsupCmmRgstResult | ๋ฐ์ก์์ฒญ ๋ฑ๋ก ๊ฒฐ๊ณผ ์กฐํ |
| MA115 | getMsupWrhsDtlInfo | ์ ๊ณ ๋ด์ญ ์ ๋ณด ์กฐํ(ํ์ด์ง) |
| MA116 | getMsupQrtrRptPrdInfo | ๋ถ๊ธฐ๋ณ ๋ณด๊ณ ๊ธฐ๊ฐ ์กฐํ |
| MA119 | getMsupWrhsDtlListInfo | ์ ๊ณ ๋ด์ญ ์ ๋ณด ์กฐํ(๋ชฉ๋ก) |
ํต์ฌ ์ ๋ฌด ํ๋ฆ
MA116 ๋ณด๊ณ ๊ธฐ๊ฐ ์กฐํ
โ MA101 ํ์ค์ฝ๋ ๊ฒ์ฆ
โ MA111 ๊ณต๊ธ๋ด์ญ ๋ฑ๋ก
โ MA112 ๊ฒฐ๊ณผ ์กฐํ
โ (๋ฐ์ก ์) MA113 ๋ฐ์ก์ ์ฒญ
โ MA114 ๊ฒฐ๊ณผ ์กฐํ์ธ์ฆ ์ด์ํ
KPIS API๋ ํธ์ถ ์ ํ์ ๋ฐ๋ผ ์ธ์ฆ ๋ฐฉ์์ด ์์ ํ ๋ค๋ฆ ๋๋ค.
API KEY ์ธ์ฆ (์กฐํ)
์กฐํ API๋ ์์ฒญ ํ๋ผ๋ฏธํฐ์ apiKey์ aplHbin(์ฌ์
์๋ฑ๋ก๋ฒํธ)์ ํฌํจํ์ฌ ํธ์ถํฉ๋๋ค.
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
| ๋์ API | MA101 |
| ์ธ์ฆ ๋ฐฉ์ | REST ์์ฒญ ํ๋ผ๋ฏธํฐ (apiKey + aplHbin) |
| ํ๋ก์ ๊ฒฝ๋ก | server/routes/kpisProxy.ts |
| ์ค์ ์์น | ๊ด๋ฆฌ์ > API ์ค์ ํจ๋ |
JWT + ๊ณต๋์ธ์ฆ์ (๋ฑ๋ก)
๋ฑ๋ก API๋ ์๋ฒ์์ JWT ํ ํฐ์ ๋ฐ๊ธ๋ฐ๊ณ , ๊ณต๋์ธ์ฆ์๋ก SOAP ๋ฉ์์ง์ ์ ์์๋ช ํ์ฌ ํธ์ถํฉ๋๋ค.
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
| ๋์ API | MA111~MA116, MA119 |
| ์ธ์ฆ ๋ฐฉ์ | JWT(Authorization: Bearer) + WS-Security ์ ์์๋ช
|
| ํ๋ก์ ๊ฒฝ๋ก | server/routes/kpisJwtProxy.ts |
| ์๋ช ๋ผ์ด๋ธ๋ฌ๋ฆฌ | node-forge (RSA-SHA256) |
JWT ๋ฐ๊ธ ๊ณผ์
- ์๋ฒ ํ๊ฒฝ๋ณ์์
CLIENT_ID/CLIENT_SECRET์ผ๋ก KPIS ์ธ์ฆ ์๋ฒ์ ํ ํฐ ์์ฒญ - ๋ฐ๊ธ๋ JWT๋ฅผ
Authorization: Bearer {jwt}ํค๋์ ํฌํจ - ํ ํฐ์ DB(
jwt_tokensํ ์ด๋ธ)์ ์บ์ฑํ์ฌ ์ฌ์ฌ์ฉ - ๋ง๋ฃ ์ ์๋ ์ฌ๋ฐ๊ธ
JWT ์๊ฒฉ ์ฆ๋ช ์ ์๋ฒ ํ๊ฒฝ๋ณ์๋ก๋ง ๊ด๋ฆฌํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์ ๋ ๋ ธ์ถ๋์ง ์์ต๋๋ค.
๊ณต๋์ธ์ฆ์ ๊ด๋ฆฌ
MA111~MA116 ๋ฑ๋ก API ํธ์ถ ์ ํ์์ธ ๊ณต๋์ธ์ฆ์(.pfx)์ ๊ด๋ฆฌ ์ ์ฐจ์
๋๋ค.
์ธ์ฆ์ ์ ๋ก๋
๊ด๋ฆฌ์(admin ์ญํ )๋ง ์ธ์ฆ์๋ฅผ ์
๋ก๋ํ ์ ์์ต๋๋ค.
- ๊ด๋ฆฌ์ > ์ธ์ฆ์ ๊ด๋ฆฌ ๋ฉ๋ด์ ์ ์ํฉ๋๋ค.
.pfxํ์ผ์ ์ ํํ๊ณ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํฉ๋๋ค.- ์ ๋ก๋ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
- ์๋ฒ๊ฐ ์ธ์ฆ์๋ฅผ 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/:stdCd | 13์๋ฆฌ ์ฝ๋๋ก ์ ํ ์กฐํ |
๊ฒ์ 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/users | admin | ์ ์ฒด ์ฌ์ฉ์ ๋ชฉ๋ก |
| PATCH | /api/users/:userId/approve | admin | ์ฌ์ฉ์ ์น์ธ |
| PATCH | /api/users/:userId/role | admin | ์ญํ ๋ณ๊ฒฝ (admin / user) |
์ธ์ฆ์ ๊ด๋ฆฌ (/api/cert-config)
| Method | ์๋ํฌ์ธํธ | ๊ถํ | ์ค๋ช |
|---|---|---|---|
| GET | /api/cert-config/meta | ๋ก๊ทธ์ธ | ์ธ์ฆ์ ์ฃผ์ฒด/๋ง๋ฃ์ผ/์ํ |
| POST | /api/cert-config/upload | admin | .pfx + ๋น๋ฐ๋ฒํธ ์ ๋ก๋ |
| DELETE | /api/cert-config | admin | ์ธ์ฆ์ ์ญ์ |
| 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 ์ค์ ๋ณ๊ฒฝ
- ๊ด๋ฆฌ์ > API ์ค์ ๋ฉ๋ด์ ์ ์ํฉ๋๋ค.
- ์ฌ์ ์๋ฑ๋ก๋ฒํธ์ API KEY๋ฅผ ์ ๋ ฅํฉ๋๋ค.
- API KEY๋ BASE64 ์ํธํ๋์ด DB(
api_config)์ ์ ์ฅ๋ฉ๋๋ค. - ์ ์ฅ ํ ์กฐํ API(MA101 ๋ฑ)๊ฐ ์ฆ์ ๋์ํฉ๋๋ค.
KPIS API ํ๊ฒฝ
| ํ๊ฒฝ | URL | ์ฉ๋ |
|---|---|---|
| ๊ฐ๋ฐ | http://devopenapi.kpis.or.kr | ํ ์คํธ/๊ฐ๋ฐ |
| ์ด์ | https://newopenapi.kpis.or.kr | ์ค์ ๋ณด๊ณ |
์ด์ ํ๊ฒฝ์ Oracle Cloud ์๋ฒ์ Floating IP๊ฐ KPIS ํ์ดํธ๋ฆฌ์คํธ์ ๋ฑ๋ก๋์ด ์์ด์ผ ํธ์ถ ๊ฐ๋ฅํฉ๋๋ค.
๋ค์ ๋จ๊ณ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค โ SQLite ํ ์ด๋ธ ๊ตฌ์กฐ ๋ฐ ๋๊ธฐํ
- ๋ฌธ์ ํด๊ฒฐ โ API ์ฐ๋ ์คํจ ๋์