프로젝트

일반

사용자정보

서버 API 접근 보안 » 이력 » 버전 20

이름없음, 2021/11/30 08:01

1 9 이름없음
h1. 서버 API 접근 보안
2 1 이름없음
3 7 이름없음
h2(#wiki-id-API서버접근보안-API서버접근허가흐름도). API 서버 접근 허가 흐름도
4 1 이름없음
5
* DID(Decentralized Identifier) + JWT(JSON Web Token) 기반 인증
6 11 이름없음
** 사용자 구분은 DID ( Decentralized Identity ) 로 하고 있으며 Hyperledger Indy ( https://www.hyperledger.org/use/hyperledger-indy ) 솔루션을 사용합니다
7 10 이름없음
** JWT (Jason Web Token : https://jwt.io/ ) 으로 API 접근 권한을 제한하고 있습니다.
8 4 이름없음
9 14 이름없음
p=. !picture385-1.png(Indy 구조)!
10 1 이름없음
11 7 이름없음
h2(#wiki-id-API서버접근보안-JWTaccesstoken발급과검증). JWT access token 발급과 검증
12 1 이름없음
13
1) 인증서버(Auth Server)는 검증된 DID를  제출한 모바일 앱을 위하여 access token을 생성하여 반환합니다.
14
15 6 이름없음
!picture413-1.png!
16
17 1 이름없음
2) 모바일 앱은 API 서버에 요청을 보낼 때 access token을 헤더에 담아서 보냅니다. API 서버는 요청 메시지의 헤더에 있는 access token을 검증하고 자신이 발급한 것이 맞으면 요청을 수행하고 응답을 반환합니다.
18 6 이름없음
19
!picture413-2.png!
20 1 이름없음
21 12 이름없음
h2. Access Token 발급 및 호출
22
23
API 를 호출하기 위해서는 Access Token 을 발급 받아야 하며 다음과 같은 흐름으로 호출합니다
24
25 19 이름없음
!picture886-1.png!
26 12 이름없음
27 14 이름없음
1) 모바일에서 Did 를 생성하고 함께 나오는 verkey를 보관합니다.
28 1 이름없음
29 14 이름없음
2) Header에 이용하는 X-Auth-Key 를 생성합니다.
30 1 이름없음
31 19 이름없음
    (Key + did + App-Version + timestamp) 의 Hash 값을 입력합니다.
32 14 이름없음
33 19 이름없음
   ※ TestBed에서는 App-Version 로 "Test/1.0", Key 값으로 "1234567890abcdefghijklmnopqrstuvwxyz" 을 사용합니다.
34 14 이름없음
35
3) /auth/token를 통하여 access token 을 발급 받으며  Body 에는 did, verkey, timestamp 정보를 전달합니다.
36
37
    timestamp 값은 2)의 Hash 값에 사용된 timestamp 값으로 할당 하여야 하며 서버 시간과 10분 차이 까지 유효합니다
38
39
4) /auth/token API 외에 다른 API를 호출시에 X-AUTH-TOKEN 파라미터에 access token 를 포함하여 호출합니다.
40 12 이름없음
41
※ access token 은 6시간 유효 기간을 가지고 있어 만료된 후에는 재사용 불가합니다.
42
43
  API 호출하기 위하여는 access token을 재발급 하여 호출합니다.
44
45 18 이름없음
h2. X-Auth-Key 생성하기
46 15 이름없음
47 17 이름없음
https://openapi.myd.world/api/#/authenticate/token 의 /auth/token REST API 의 Header 및 Body 구성을 위하여
48
하기 내용의 결과값을 활용 하도록 한다
49
50
결과값)  timestamp, X-Auth-Key
51
52 15 이름없음
<pre><code class="java">
53
import java.security.MessageDigest;
54
import java.security.NoSuchAlgorithmException;
55
  
56
public class main {
57
    public static void main(String[] args) throws Exception {
58
 
59
        String hash = null;
60 19 이름없음
        String appVersion = "Test/1.0";
61 15 이름없음
        String appKey = "1234567890abcdefghijklmnopqrstuvwxyz";
62
        String did = "G5rw9qAMbozGxySHkMaztD";
63 20 이름없음
        String nonce = ""; // /auth/nonce 로 획득한 값
64 15 이름없음
 
65
        try {
66 20 이름없음
            hash = sha256(new String(appKey + did + appVersion + nonce));
67 15 이름없음
        }catch (NoSuchAlgorithmException e){
68
            e.printStackTrace();
69
        }
70 20 이름없음
        System.out.println(timestamp + "," + sha256(new String(appKey + did + appVersion + nonce)));
71 15 이름없음
    }
72
 
73
    public static String sha256(String msg) throws NoSuchAlgorithmException {
74
        MessageDigest md = MessageDigest.getInstance("SHA-256");
75
        md.update(msg.getBytes());
76
        return bytesToHex(md.digest());
77
    }
78
 
79
    public static String bytesToHex(byte[] bytes) {
80
        StringBuilder builder = new StringBuilder();
81
        for (byte b: bytes) {
82
            builder.append(String.format("%02x", b));
83
        }
84
        return builder.toString();
85
    }
86
}
87
</code></pre>
88
89
90 7 이름없음
h2(#wiki-id-API서버접근보안-관련자료). 관련 자료
91 1 이름없음
92
* "JSON Web Token (JWT)":https://tools.ietf.org/html/rfc7519
클립보드 이미지 추가 (최대 크기: 97.7 MB)