> For the complete documentation index, see [llms.txt](https://blocko-1.gitbook.io/coinstack-api-reference/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://blocko-1.gitbook.io/coinstack-api-reference/4.-authentication.md).

# 4. Authentication

## 1. 개요

코인스택 API를 사용하기 위해서는 코인스택 서버에 자격 증명(credential)을 제공해야 합니다. 자격 증명은 사용자의 요청이 변조되지 않았음을 보장하는 역할과, 각 사용자의 요청을 구별하는 역할을 수행합니다. 자격 증명 절차는 다음과 같습니다.

1. [대시보드](https://dashboard.blocko.io)에서 API 키 발급 받기
2. 직접 REST 호출을 원하는 경우 토큰 발급
3. 자신의 프로그램이나 환경 변수에 설정을 원할 경우 API키 발급
4. 발급 받은 자격증명을 아래의 설명에 따라 설정하여 코인스택 API 호출

## 2. 자격 증명 방식

자격 증명은 아래 두 가지 방식으로 서버에 전달됩니다.

### 2.1. 토큰

REST API를 직접 사용하는 경우에는 토큰을 HTTP 요청의 헤더에 포함하여 보내야 합니다. 이 경우 토큰이 평문으로 전달되기 때문에, TLS 같은 안전한 프로토콜을 권장합니다.

### 2.2. 서명

SDK를 사용하여 API를 호출하는 경우 API 키와 비밀키로 request에 대한 전자 서명을 HMAC-SHA256 방식으로 생성하여 전달합니다.

## 3. API 키 발급 및 설정

### 3.1. API 키 발급

위에서 설명한 바와 같이, 코인스택 API를 사용하기 위해서는 먼저 자격 증명이 필요합니다. [대시보드](https://dashboard.blocko.io)에서 API 키 또는 API 토큰을 발급받을 수 있습니다. Java와 Node, Meteor에서는 Access Key와 Secret Key를 사용하며, curl 등을 통해 직접 REST API를 호출하는 경우에는 Access Token을 사용합니다.

### 3.2. API 키 설정

#### 3.2.1. 환경 변수 사용

API 키 또는 API 토큰을 환경 변수에 설정하면 코드 내에 이 값들을 직접 입력하는 일을 피할 수 있습니다. 발급받은 Access Key를 COINSTACK\_ACCESS\_KEY\_ID라는 환경 변수에, Secret Key를 COINSTACK\_SECRET\_ACCESS\_KEY에 각각 할당합니다. 환경 변수를 설정하는 자세한 방법은 [환경 변수 설정 페이지](https://www.java.com/ko/download/help/path.xml)를 참조 바랍니다.

환경 변수를 설정하면, 다음과 같이 기본 생성자를 이용해 CoinStackClient 객체를 생성할 수 있습니다.

**Java**

```java
import io.blocko.coinstack.*

CoinStackClient client = new CoinStackClient();
```

**Node.js**

```javascript
var CoinStack = require('coinstack-sdk-js')
var client = new CoinStack();
```

**Meteor**

```javascript
export COINSTACK_ACCESS_KEY="YOUR_COINSTACK_ACCESS_KEY";
export COINSTACK_SECRET_KEY="YOUR_COINSTACK_SECRET_KEY";
var client = new CoinStack();
```

#### 3.2.2. 코드 내에 직접 입력

**REST API**

curl을 사용하여 REST API를 통해 키를 직접 입력, 호출하는 방법은 다음과 같습니다.

```bash
curl https://mainnet.cloudwallet.io/ \
    -H "apiKey: YOUR_API_TOKEN_KEY"
```

**Java**

다음과 같이 객체 생성자에 직접 키를 입력할 수도 있습니다.

```java
//import io.blocko.coinstack.*
//import io.blocko.coinstack.model.*

CoinStackClient client = new CoinStackClient(new CredentialsProvider() {
            @Override
            public String getAccessKey() {
                return "발급받은 access key";
            }

            @Override
            public String getSecretKey() {
                return "발급받은 secret key";
            }
        }, Endpoint.MAINNET);
```

**Node.js**

```javascript
var accessKey = "YOUR_COINSTACK_ACCESS_KEY";
var secretKey = "YOUR_COINSTACK_SECRET_KEY";
var client = new CoinStack(accessKey, secretKey);
```

**Meteor**

```javascript
var accessKey = "YOUR_COINSTACK_ACCESS_KEY";
var secretKey = "YOUR_COINSTACK_SECRET_KEY";
var client = new CoinStack(accessKey, secretKey);
```
