ba5b2e61a5
- KJBank 레이아웃, 프래그먼트 파일 DJBank로 변경 - HTML 레이아웃 파일 KJBank에서 DJBank로 업데이트
301 lines
11 KiB
HTML
301 lines
11 KiB
HTML
<!doctype html>
|
|
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
|
|
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/djbank_base_layout}"
|
|
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
|
|
|
|
|
|
<body>
|
|
|
|
<section layout:fragment="contentFragment" class="content api_con">
|
|
<style>
|
|
.cm-s-custom-dark.CodeMirror {
|
|
background-color: #252B37;
|
|
color: white;
|
|
}
|
|
.cm-s-custom-dark .CodeMirror-gutters {
|
|
background-color: #1a1a1a;
|
|
border-right: 1px solid #3a3a3a;
|
|
}
|
|
.cm-s-custom-dark .CodeMirror-linenumber {
|
|
color: #777;
|
|
}
|
|
.cm-s-custom-dark .CodeMirror-cursor {
|
|
border-left: 1px solid white;
|
|
}
|
|
.cm-s-custom-dark .cm-keyword { color: #66d9ef; }
|
|
.cm-s-custom-dark .cm-atom { color: #bd93f9; }
|
|
.cm-s-custom-dark .cm-number { color: #ff79c6; }
|
|
.cm-s-custom-dark .cm-def { color: #50fa7b; }
|
|
.cm-s-custom-dark .cm-variable { color: #f8f8f2; }
|
|
.cm-s-custom-dark .cm-variable-2 { color: #fff; }
|
|
.cm-s-custom-dark .cm-variable-3 { color: #ff79c6; }
|
|
.cm-s-custom-dark .cm-property { color: #66d9ef; }
|
|
.cm-s-custom-dark .cm-operator { color: #ff79c6; }
|
|
.cm-s-custom-dark .cm-comment { color: #6272a4; }
|
|
.cm-s-custom-dark .cm-string { color: #f1fa8c; }
|
|
.cm-s-custom-dark .cm-string-2 { color: #f1fa8c; }
|
|
.cm-s-custom-dark .cm-meta { color: #50fa7b; }
|
|
.cm-s-custom-dark .cm-qualifier { color: #50fa7b; }
|
|
.cm-s-custom-dark .cm-builtin { color: #50fa7b; }
|
|
.cm-s-custom-dark .cm-bracket { color: #f8f8f2; }
|
|
.cm-s-custom-dark .cm-tag { color: #ff79c6; }
|
|
.cm-s-custom-dark .cm-attribute { color: #50fa7b; }
|
|
.cm-s-custom-dark .cm-hr { color: #f8f8f2; }
|
|
.cm-s-custom-dark .cm-link { color: #8be9fd; }
|
|
.cm-s-custom-dark .cm-error { color: #ff5555; }
|
|
</style>
|
|
<div class="content_wrap w_api">
|
|
<div class="sub_title4">
|
|
<h2 class="title">API 개발 공통</h2>
|
|
</div>
|
|
<div class="inner i_cs h_inner2">
|
|
<div class="api_stit api_dot">
|
|
<h3>요청 메시지</h3>
|
|
<ul>
|
|
<li>
|
|
<p>API 는 네트웍 보안을 위해 TLS1.2 을 기반으로 하는 상호 인증을 거칩니다.</p>
|
|
</li>
|
|
<li>
|
|
<p>수신된 API 는 제휴기관의 정보등을 확인 하여 인증 처리를 거쳐 인증된
|
|
Token 값으로 요청된 전문에 대해 업무를 처리 하게 됩니다.</p>
|
|
</li>
|
|
<li>
|
|
<p>API 송수신은 모두 동기 방식으로 진행 되며, 응답 대기시간은 최대 60초 입니다.
|
|
응답 결과에 따라 전문 재 요청 등의 추가적인 Process를 진행합니다.</p>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="api_stit stit api_star">
|
|
<h3>기본사항</h3>
|
|
<ul>
|
|
<li>
|
|
<p>JSON (JavaScript Object Notation)</p>
|
|
<span>경량의 Data-교환 형식으로, 데이터를 속성-값 형식으로 표현하는 개방형 표준 Data 형태입니다.</span>
|
|
</li>
|
|
<li>
|
|
<p>UTF-8</p>
|
|
<span>유니코드를 위한 가변 길이 문자 인코딩 방식 중 하나로, 전 세계 모든 문자코드를 표현할 수 있습니다.</span>
|
|
</li>
|
|
<li>
|
|
<p>인증방식</p>
|
|
<span>OAuth2.0의 Client Credentials Grant 방식을 준용합니다. Token의 유효 시간은 86400초(24시간)이며,
|
|
유효시간이 경과하면 token을 재발급 하여야 합니다.</span>
|
|
</li>
|
|
<li>
|
|
<p>Token</p>
|
|
<span>케이뱅크에서는 Token으로 JWS(JSON Web Signature)를 사용합니다.
|
|
케이뱅크에서는 Header 및 Payload 정보를 BASE64를 Encoding 하여 token을 생성하고 이를 전달 합니다.</span>
|
|
</li>
|
|
<li>
|
|
<p>암복호화</p>
|
|
<span>제휴 기관이 케이뱅크 펌뱅킹 API 이용 승인이 되면 제공되는 ID와 Secret 외에 KEY 값을 받게 됩니다. 해당 KEY 를 이용하여 암호화된 컬럼을 복호화하여 이용할 수 있습니다. 암호화 대상컬럼에 명시된 컬럼 size는 암호화 전 기준의 size입니다. (암호화 시 부족한 컬럼 사이즈는 스페이스 처리하며 암호화 후 컬럼 사이즈는 가상계좌번호, 출금계좌번호 16byte 실명번호 24byte)</span>
|
|
</li>
|
|
<li th:if="${#authorization.expression('isAuthenticated()')}">
|
|
<p>도메인정보</p>
|
|
<ul class="dash">
|
|
<li>-(운영) apigw.kbanknow.com (121.162.123.140)</li>
|
|
<li>-(개발) api.kbankcorp.co.kr (211.217.240.140)</li>
|
|
</ul>
|
|
</li>
|
|
<li th:if="${#authorization.expression('isAuthenticated()')}">
|
|
<p>포트정보 : 40443 (운영, 개발)</p>
|
|
</li>
|
|
<li>
|
|
<p>방화벽 정책</p>
|
|
<span>제휴기관의 도메인에 매핑된 모든 IP가 케이뱅크측 화이트리스트에 등록되어야 하므로 사전에 접속하고자하는 서버의 공인IP정보가 제공되어야 합니다.</span>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="api_stit stit">
|
|
<h3>컬럼 타입별 정의</h3>
|
|
<div class="pc-only">
|
|
<table class="api_table api_tb" cellspacing="0" cellpadding="0" width="100%">
|
|
<colgroup>
|
|
<col width="140px">
|
|
<col width="auto">
|
|
</colgroup>
|
|
<tbody>
|
|
<tr>
|
|
<th>N</th>
|
|
<td>NUMERIC</td>
|
|
</tr>
|
|
<tr>
|
|
<th>S</th>
|
|
<td>SPECIAL</td>
|
|
</tr>
|
|
<tr>
|
|
<th>A</th>
|
|
<td>ALPHABETIC</td>
|
|
</tr>
|
|
<tr>
|
|
<th>AH</th>
|
|
<td>한글(UTF-8 3byte 체계)</td>
|
|
</tr>
|
|
<tr>
|
|
<th>AN</th>
|
|
<td>ALPHA-NUMERIC</td>
|
|
</tr>
|
|
<tr>
|
|
<th>SN</th>
|
|
<td>SPECIAL-NUMERIC</td>
|
|
</tr>
|
|
<tr>
|
|
<th>ANS</th>
|
|
<td>ALPHA-NUMERIC SPECIAL</td>
|
|
</tr>
|
|
<tr>
|
|
<th>AHNS</th>
|
|
<td>한글-NUMERIC SPECIAL</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<div class="m-only">
|
|
<table class="api_table api_tb" cellspacing="0" cellpadding="0" width="100%">
|
|
<colgroup>
|
|
<col width="80px">
|
|
<col width="auto">
|
|
</colgroup>
|
|
<tbody>
|
|
<tr>
|
|
<th>N</th>
|
|
<td>NUMERIC</td>
|
|
</tr>
|
|
<tr>
|
|
<th>S</th>
|
|
<td>SPECIAL</td>
|
|
</tr>
|
|
<tr>
|
|
<th>A</th>
|
|
<td>ALPHABETIC</td>
|
|
</tr>
|
|
<tr>
|
|
<th>AH</th>
|
|
<td>한글(UTF-8 3byte 체계)</td>
|
|
</tr>
|
|
<tr>
|
|
<th>AN</th>
|
|
<td>ALPHA-NUMERIC</td>
|
|
</tr>
|
|
<tr>
|
|
<th>SN</th>
|
|
<td>SPECIAL-NUMERIC</td>
|
|
</tr>
|
|
<tr>
|
|
<th>ANS</th>
|
|
<td>ALPHA-NUMERIC SPECIAL</td>
|
|
</tr>
|
|
<tr>
|
|
<th>AHNS</th>
|
|
<td>한글-NUMERIC SPECIAL</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div class="api_data">
|
|
<div class="data_lt">
|
|
<dl>
|
|
<dt>①</dt>
|
|
<dd>DATA 속성이 “N”인 FIELD는 RIGHT-JUSTIFIED하고, 남는 부분은 “0”로 SET한다.</dd>
|
|
</dl>
|
|
<dl>
|
|
<dt>②</dt>
|
|
<dd>ATA 속성이 “SN”인 FIELD는 그 값이 “-”인 경우는 첫 자리에 “-”를 표시하고, “0” 또는 “+”인 경우에는 해당 값을 RIGHT-JUSTIFIED하여 SET한다.</dd>
|
|
</dl>
|
|
<dl>
|
|
<dt>③</dt>
|
|
<dd>DATA 속성이 “A”, “AN”, “AH”, “ANS”, “AHNS”인 FIELD는 LEFT-JUSTIFIED하고, 남는 부분은 BLANK로 SET한다.</dd>
|
|
</dl>
|
|
<dl>
|
|
<dt>④</dt>
|
|
<dd>OPTIONAL FIELD는 그 속성에 따라 “0” 또는 BLANK로 SET한다.</dd>
|
|
</dl>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="api_stit api_sc">
|
|
<h3>컬럼 복호화sample (JAVA 기준)</h3>
|
|
<ul>
|
|
<li>
|
|
<p class="tit">
|
|
<span>AES256 암/복호화 소스</span>
|
|
</p>
|
|
<div class="api_sauce">
|
|
<textarea id="sampleCode">
|
|
public static String encryptAES(String key, String text) {
|
|
return encrypt(key, text, "AES");
|
|
}
|
|
|
|
public static String decryptAES(String key, String text) {
|
|
return decrypt(key, text, "AES");
|
|
}
|
|
|
|
public static String encrypt(String key, String text, String algorithm) throws IllegalArgumentException {
|
|
SecretKeySpec securekey = new SecretKeySpec(key.getBytes(), algorithm);
|
|
|
|
try {
|
|
Cipher cipher = Cipher.getInstance(algorithm);
|
|
cipher.init(Cipher.ENCRYPT_MODE, securekey);
|
|
byte[] encryptedData = cipher.doFinal(text.getBytes());
|
|
char[] temp = Base64.encode(encryptedData);
|
|
return new String(temp);
|
|
} catch (Exception var7) {
|
|
throw new IllegalArgumentException(var7.toString());
|
|
}
|
|
}
|
|
|
|
public static String decrypt(String key, String text, String algorithm) {
|
|
Key secureKey = new SecretKeySpec(key.getBytes(), algorithm);
|
|
byte[] encryptedData = Base64.decode(text.toCharArray());
|
|
try {
|
|
Cipher cipher = Cipher.getInstance(algorithm);
|
|
cipher.init(Cipher.DECRYPT_MODE, secureKey);
|
|
byte[] plainText = cipher.doFinal(encryptedData);
|
|
return new String(plainText);
|
|
} catch (Exception var7) {
|
|
throw new IllegalArgumentException(var7.toString());
|
|
}
|
|
}
|
|
|
|
</textarea>
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div class="api_btn">
|
|
<a href="#none" class="common_btn_type_1" id="requestApiKey">API 이용 신청</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</section>
|
|
</body>
|
|
|
|
|
|
<th:block layout:fragment="contentScript">
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', (event) => {
|
|
const commonOptions = {
|
|
lineNumbers: false,
|
|
mode: { name: "text/x-java"},
|
|
theme: 'custom-dark',
|
|
readOnly: true,
|
|
autoCloseBrackets: true,
|
|
matchBrackets: true,
|
|
foldGutter: true,
|
|
indentWithTabs: true,
|
|
lineWrapping: true
|
|
};
|
|
const sampleCodeEditor = CodeMirror.fromTextArea(document.getElementById('sampleCode'), commonOptions);
|
|
sampleCodeEditor.setSize(null, 540);
|
|
sampleCodeEditor.refresh();
|
|
});
|
|
</script>
|
|
|
|
</th:block>
|
|
|
|
</html>
|