

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 사용자 지정 인증을 사용하여 AWS IoT Core 에 연결
<a name="custom-auth"></a>

 디바이스는 AWS IoT Core 에서 디바이스 메시징을 AWS IoT Core 지원하는 모든 프로토콜에서 사용자 지정 인증을 사용하여에 연결할 수 있습니다. 지원되는 통신 프로토콜에 대한 자세한 내용은 [디바이스 통신 프로토콜](protocols.md) 단원을 참조하세요.   권한 부여자 Lambda 함수에 전달하는 연결 데이터는 사용하는 프로토콜에 따라 다릅니다. 권한 부여자 Lambda 함수를 만드는 방법에 대한 자세한 내용은 [Lambda 함수 정의](custom-auth-lambda.md) 단원을 참조하세요. 다음 단원에서는 지원되는 각 프로토콜을 사용하여 인증에 연결하는 방법을 설명합니다.

## HTTPS
<a name="custom-auth-http"></a>

[HTTP 게시 API](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html)를 사용하여 AWS IoT Core 로 데이터를 전송하는 디바이스는 HTTP POST 요청의 요청 헤더 또는 쿼리 파라미터를 통해 자격 증명을 전달할 수 있습니다. 디바이스는 `x-amz-customauthorizer-name` 헤더 또는 쿼리 파라미터를 사용하여 호출할 권한 부여자를 지정할 수 있습니다. 권한 부여자에서 토큰 서명을 활성화한 경우 요청 헤더 또는 쿼리 파라미터 중 하나에서 `token-key-name` 및 `x-amz-customauthorizer-signature`을(를) 전달해야 합니다. 참고: 브라우저에서 JavaScript를 사용할 경우 `token-signature` 값은 URL로 인코딩해야 합니다.

**참고**  
HTTPS 프로토콜의 고객 권한 부여자는 게시 작업만 지원합니다. HTTPS 프로토콜에 대한 자세한 내용은 [디바이스 통신 프로토콜](protocols.md) 섹션을 참조하세요.

다음 예제 요청은 요청 헤더와 쿼리 파라미터 모두에서 이러한 파라미터를 전달하는 방법을 보여 줍니다.

```
//Passing credentials via headers
POST /topics/topic?qos=qos HTTP/1.1
Host: your-endpoint 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
x-amz-customauthorizer-name: authorizer-name

//Passing credentials via query parameters
POST /topics/topic?qos=qos&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value HTTP/1.1
```

## MQTT
<a name="custom-auth-mqtt"></a>

 MQTT 연결을 사용하여 AWS IoT Core 에 연결하는 디바이스는 MQTT 메시지의 `username` 및 `password` 필드를 통해 자격 증명을 전달할 수 있습니다. `username` 값에는 추가 값(토큰, 서명 및 권한 부여자 이름 포함)을 권한 부여자에게 전달하는 쿼리 문자열이 선택적으로 포함될 수도 있습니다. `username` 및 `password` 값 대신 토큰 기반 인증 체계를 사용하려는 경우 이 쿼리 문자열을 사용할 수 있습니다.  

**참고**  
 암호 필드의 데이터는 base64로 인코딩됩니다 AWS IoT Core. 디코딩은 Lambda 함수로 해야 합니다.

 다음 예제는 토큰 및 서명을 지정하는 추가 파라미터가 포함된 `username` 문자열을 포함합니다.  

```
username?x-amz-customauthorizer-name=authorizer-name&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value
```

권한 부여자를 호출하려면 MQTT 및 사용자 지정 인증을 사용하여 AWS IoT Core 에 연결하는 디바이스가 포트 443에서 연결되어야 합니다. 또한 값이 인 Application Layer Protocol Negotiation(ALPN) TLS 확장`mqtt`과 AWS IoT Core 데이터 엔드포인트의 호스트 이름이 있는 Server Name Indication(SNI) 확장을 전달해야 합니다. 잠재적 오류를 방지하기 위해 `x-amz-customauthorizer-signature` 값은 URL 인코딩을 해야 합니다. 또한 `x-amz-customauthorizer-name` 및 `token-key-name` 값을 URL 인코딩하는 것을 적극 권장합니다. 이러한 값에 대한 자세한 정보는 [디바이스 통신 프로토콜](protocols.md) 섹션을 참조하세요. V2 [AWS IoT 디바이스 SDK, 모바일 SDK 및 AWS IoT 디바이스 클라이언트](iot-sdks.md)는 이 두 확장을 모두 구성할 수 있습니다. 

## WebSocket을 통한 MQTT
<a name="custom-auth-websockets"></a>

 MQTT over WebSockets AWS IoT Core 을 사용하여에 연결하는 디바이스는 다음 두 가지 방법 중 하나로 자격 증명을 전달할 수 있습니다.
+ WebSockets 연결 설정을 위해 HTTP 업그레이드 요청의 요청 헤더 또는 쿼리 파라미터를 통해.
+ MQTT 연결 메시지의 `username` 및 `password` 필드를 통해.

 MQTT 연결 메시지를 통해 자격 증명을 전달하면 ALPN 및 SNI TLS 확장이 필요합니다. 이러한 확장에 대한 자세한 내용은 [MQTT](#custom-auth-mqtt) 단원을 참조하세요. 다음 예에서는 HTTP 업그레이드 요청을 통해 자격 증명을 전달하는 방법을 보여 줍니다.

```
GET /mqtt HTTP/1.1
Host: your-endpoint 
Upgrade: WebSocket 
Connection: Upgrade 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
sec-WebSocket-Key: any random base64 value 
sec-websocket-protocol: mqtt 
sec-WebSocket-Version: websocket version
```

## 토큰에 서명하기
<a name="custom-auth-token-signature"></a>

`create-authorizer` 호출에서 사용한 퍼블릭-프라이빗 키 페어의 프라이빗 키를 사용하여 토큰에 서명해야 합니다. 다음 예제에서는 UNIX 계열 명령과 JavaScript를 사용하여 토큰 서명을 생성하는 방법을 보여줍니다. 이들은 SHA-256 해시 알고리즘을 사용하여 서명을 인코딩합니다.

------
#### [ Command line ]

```
echo -n TOKEN_VALUE | openssl dgst -sha256 -sign PEM encoded RSA private key | openssl base64
```

------
#### [ JavaScript ]

```
const crypto = require('crypto')

const key = "PEM encoded RSA private key"

const k = crypto.createPrivateKey(key)
let sign = crypto.createSign('SHA256')
sign.write(t)
sign.end()
const s = sign.sign(k, 'base64')
```

------