연결 인증하기

Snowflake에 인증하기 위해서는 다음 옵션 중 1개를 사용할 수 있습니다.

또한, Snowflake Node.js 드라이버는 SSO 및 MFA 토큰을 캐시하는 기능을 지원합니다. 자세한 내용은 인증 토큰 캐싱 섹션을 참조하십시오.

웹 브라우저를 통해 Single Sign-On(SSO) 사용하기

Snowflake에서 Single Sign-On(SSO) 을 사용하도록 구성한 경우, 브라우저 기반 SSO를 사용하여 인증하도록 클라이언트 애플리케이션을 구성할 수 있습니다.

애플리케이션 코드에서:

  1. authenticator 옵션을 EXTERNALBROWSER 로 설정합니다.

  2. 연결하려면 connect 메서드가 아닌 connectAsync 메서드를 호출합니다.

예:

// Use a browser to authenticate via SSO.
var connection = snowflake.createConnection({
  ...,
  authenticator: "EXTERNALBROWSER"
});
// Establish a connection. Use connectAsync, rather than connect.
connection.connectAsync(
  function (err, conn)
  {
    ... // Handle any errors.
  }
).then(() =>
{
  // Execute SQL statements.
  var statement = connection.execute({...});
});
Copy

웹 기반 SSO를 사용한 인증에 대한 자세한 내용은 브라우저 기반 SSO 를 참조하십시오.

Okta를 통해 네이티브 SSO 사용하기

Okta를 통해 Snowflake에서 Single Sign-On(SSO)를 사용하도록 구성 한 경우, Okta를 통해 기본 SSO 인증을 사용하도록 클라이언트 애플리케이션을 구성할 수 있습니다.

애플리케이션 코드에서:

  1. 다음 옵션을 설정합니다.

    • authenticator 옵션을 Okta 계정(예: https://<okta_계정_이름>.okta.com)에 대한 Okta URL 엔드포인트로 설정합니다.

    • usernamepassword 옵션을 ID 공급자(IdP)의 사용자 이름 및 비밀번호로 설정합니다.

  2. 연결하려면 connect 메서드가 아닌 connectAsync 메서드를 호출합니다.

예:

// Use native SSO authentication through Okta.
var connection = snowflake.createConnection({
  ...,
  username: '<user_name_for_okta>',
  password: '<password_for_okta>',
  authenticator: "https://myaccount.okta.com"
});

// Establish a connection.
connection.connectAsync(
  function (err, conn)
  {
    ... // Handle any errors.
  }
);

// Execute SQL statements.
var statement = connection.execute({...});
Copy

Okta를 통한 기본 SSO 인증 사용과 관련한 자세한 내용은 기본 SSO — Okta만 해당 을 참조하십시오.

키 페어 인증 및 키 페어 순환 사용

드라이버는 키 페어 인증 및 키 순환을 지원합니다. 키 페어 인증 및 키 순환을 사용하려면 아래 단계를 따르십시오.

  1. 키 페어 인증 및 키 페어 순환 에서의 설명과 같이 키 페어 인증을 구성합니다.

  2. 애플리케이션 코드에서:

    1. authenticator 옵션을 SNOWFLAKE_JWT 로 설정합니다.

    2. 개인 키를 사용하여 다음 방법 중 1개로 인증합니다.

      • privateKey 옵션을 개인 키로 설정합니다.

      • privateKeyPath 옵션을 개인 키 파일의 경로로 설정합니다.

        파일이 암호화된 경우에는 privateKeyPass 옵션도 개인 키의 암호를 해독하기 위한 암호 구문으로 설정해야 합니다.

다음 예에서는 파일에서 개인 키를 로드하여 privateKey 옵션을 개인 키로 설정합니다.

// Read the private key file from the filesystem.
var crypto = require('crypto');
var fs = require('fs');
var privateKeyFile = fs.readFileSync('<path_to_private_key_file>/rsa_key.p8');

// Get the private key from the file as an object.
const privateKeyObject = crypto.createPrivateKey({
  key: privateKeyFile,
  format: 'pem',
  passphrase: 'passphrase'
});

// Extract the private key from the object as a PEM-encoded string.
var privateKey = privateKeyObject.export({
  format: 'pem',
  type: 'pkcs8'
});

// Use the private key for authentication.
var connection = snowflake.createConnection({
  ...
  authenticator: "SNOWFLAKE_JWT",
  privateKey: privateKey
});

// Establish a connection.
connection.connect(
  function (err, conn)
  {
    ... // Handle any errors.
  }
);

// Execute SQL statements.
var statement = connection.execute({...});
Copy

다음 예에서는 privateKeyPath 옵션을 암호화된 개인 키 파일로 설정하고 privateKeyPass 옵션을 개인 키의 암호를 해독하기 위해 사용되는 암호 구문으로 설정합니다.

// Use an encrypted private key file for authentication.
// Specify the passphrase for decrypting the key.
var connection = snowflake.createConnection({
  ...
  authenticator: "SNOWFLAKE_JWT",
  privateKeyPath: "<path-to-privatekey>/privatekey.p8",
  privateKeyPass: '<passphrase_to_decrypt_the_private_key>'
});

// Establish a connection.
connection.connect(
  function (err, conn)
  {
    ... // Handle any errors.
  }
);

// Execute SQL statements.
var statement = connection.execute({...});
Copy

OAuth 사용하기

OAuth를 사용하려 연결하려면, authenticator 옵션을 OAUTH 로 설정하고 token 옵션을 OAuth 액세스 토큰으로 설정합니다. 예:

// Use OAuth for authentication.
var connection = snowflake.createConnection({
  ...
  authenticator: "OAUTH",
  token: "<your_oauth_token>"
});

// Establish a connection.
connection.connect(
  function (err, conn)
  {
    ... // Handle any errors.
  }
);

// Execute SQL statements.
var statement = connection.execute({...});
Copy

자세한 내용은 클라이언트, 드라이버 및 커넥터 섹션을 참조하십시오.

MFA 암호 사용하기

참고

이 기능을 사용하려면 Snowflake Node.js 드라이버 버전 1.13.1 이상이 필요합니다.

Duo의 푸시 알림과 같은 외부 확인을 기다리지 않고 다단계 인증(MFA) 암호를 전달하여 Snowflake에 연결할 수 있습니다. 드라이버는 다음과 같은 방법으로 MFA 암호를 지정할 수 있습니다.

  • 다음과 같이 비밀번호 문자열의 일부로 비밀번호를 포함하도록 passcodeInPassword 옵션을 true 로 설정합니다.

    const connection = snowflake.createConnection({
        account: process.env.SNOWFLAKE_TEST_ACCOUNT,
        username: process.env.SNOWFLAKE_TEST_USER,
        ...
        authenticator: 'USERNAME_PASSWORD_MFA',
        password: "abc123987654", // passcode 987654 is part of the password
        passcodeInPassword: true  // because passcodeInPassword is true
    });
    
    Copy
  • 다음과 같이 비밀번호와 암호를 별도로 지정하려면 passcode 옵션을 암호의 값으로 설정합니다.

    const connection = snowflake.createConnection({
        account: process.env.SNOWFLAKE_TEST_ACCOUNT,
        username: process.env.SNOWFLAKE_TEST_USER,
        ...
        authenticator: 'USERNAME_PASSWORD_MFA',
        password: "abc123", // password and MFA passcode are input separately
        passcode: "987654"
    });
    
    Copy

    이 방법을 사용하려면 passcodeInPassword 옵션이 false (기본값)인지 확인합니다.

참고

codenowrap:passcodeInPassword 옵션을 활성화하고 passcode 옵션을 설정하면 passcodeInPassword 옵션이 우선 적용됩니다.

이러한 옵션에 대한 자세한 내용은 passcode 섹션을 참조하십시오.

인증 토큰 캐싱

Snowflake Node.js 드라이버는 SSO 및 MFA 토큰을 캐시하는 기능을 제공합니다.

중요

토큰 캐싱은 기본적으로 비활성화되어 있습니다. 토큰을 로컬에 캐싱하면 보안 리스크가 증가합니다. 토큰은 4시간 동안 만료되지 않으므로 로컬 시스템에서 토큰에 액세스하는 사람은 토큰이 자연스럽게 만료될 때까지 토큰 소유자를 가장할 수 있습니다. 따라서 토큰 캐시를 선택하기 전에 다음 사항을 고려하십시오.

  • 잠재적인 위험을 인식하고 주의합니다.

  • 조직의 정책이 토큰 캐싱을 허용하는지 확인하려면 내부 보안 및 규정 준수 담당자와 상의합니다.

  • 기본 설정에서는 캐시된 토큰을 저장하는 파일이 $HOME 디렉터리 또는 사용자가 직접 구성한 경로에 기록됩니다. 지정된 디렉터리에 있는 데이터의 보안에 대한 책임은 사용자에게 있습니다.

  • 파일 소유자만 파일에 액세스할 수 있는 적절한 권한이 있는지 확인하는 것은 사용자의 책임입니다.

캐시 SSO(ID) 토큰

외부 브라우저 인증 으로 Snowflake에 연결할 때 요청에서 SSO(ID) 토큰이 생성됩니다. 클라이언트 드라이버 측의 SSO(ID) 토큰 캐싱은 서버에서 캐싱을 허용하는 경우에만 작동합니다. SSO 토큰 캐싱은 Snowflake에 연결하는 클라이언트 애플리케이션에서 SSO 사용하기 에 설명된 대로 다음 SQL 문을 실행하여 서버 측에서 활성화할 수 있습니다.

ALTER ACCOUNT SET ALLOW_ID_TOKEN = TRUE;
Copy

Node.js 드라이버에서 SSO 토큰 캐시를 사용하려면 snowflake.createConnection() 호출에서 다음 옵션을 설정합니다.

  • authenticatorEXTERNALBROWSER 로 설정합니다. 자세한 내용은 인증 옵션 섹션을 참조하십시오.

  • clientStoreTemporaryCredentialtrue 로 설정합니다.

const connection = snowflake.createConnection({
  account: process.env.SNOWFLAKE_TEST_ACCOUNT,
  username: process.env.SNOWFLAKE_TEST_USER,
  database: process.env.SNOWFLAKE_TEST_DATABASE,
  schema: process.env.SNOWFLAKE_TEST_SCHEMA,
  warehouse: process.env.SNOWFLAKE_TEST_WAREHOUSE,
  authenticator: 'EXTERNALBROWSER',
  clientStoreTemporaryCredential: true,
});
Copy

이 기능을 활성화하면, 드라이버는 토큰이 만료될 때까지 후속 연결에 캐시된 토큰을 사용합니다. 드라이버가 연결을 다시 인증하기 위해 브라우저를 여는 경우, 드라이버가 로컬 자격 증명 저장소에서 토큰 정보를 찾을 수 없거나 토큰이 만료된 것입니다.

캐시 MFA 토큰

USERNAME_PASSWORD_MFA 인증으로 Snowflake에 연결하면 요청에서 MFA 토큰이 생성됩니다. 클라이언트 드라이버 측의 MFA 토큰 캐싱은 서버에서 캐싱을 허용하는 경우에만 작동합니다. MFA 토큰 캐싱은 MFA 토큰 캐싱을 사용하여 인증 도중 프롬프트 수 최소화하기 — 선택 사항 에 설명된 대로 다음 SQL 문을 실행하여 서버 측에서 활성화할 수 있습니다.

ALTER ACCOUNT SET ALLOW_CLIENT_MFA_CACHING = TRUE;
Copy

Node.js 드라이버에서 MFA 토큰 캐시를 사용하려면 snowflake.createConnection() 호출에서 다음 옵션을 설정합니다.

  • authenticatorUSERNAME_PASSWORD_MFA 로 설정합니다. 자세한 내용은 인증 옵션 섹션을 참조하십시오.

  • clientRequestMFATokentrue 로 설정합니다.

const connection = snowflake.createConnection({
  account: process.env.SNOWFLAKE_TEST_ACCOUNT,
  username: process.env.SNOWFLAKE_TEST_USER,
  database: process.env.SNOWFLAKE_TEST_DATABASE,
  schema: process.env.SNOWFLAKE_TEST_SCHEMA,
  warehouse: process.env.SNOWFLAKE_TEST_WAREHOUSE,
  authenticator: 'USERNAME_PASSWORD_MFA',
  clientRequestMFAToken: true,
});
Copy

이 기능을 활성화하면, 드라이버는 토큰이 만료될 때까지 후속 연결에 캐시된 토큰을 사용합니다. 드라이버가 다시 MFA 공급자에게 연락하면 드라이버가 로컬 자격 증명 저장소에서 토큰 정보를 찾을 수 없거나 토큰이 만료된 것입니다.

기본 자격 증명 관리자 사용

Snowflake Node.js 드라이버는 자격 증명 관리자와 자격 증명 저장소를 제공합니다. 기본적으로 드라이버는 캐시된 토큰을 $HOME 디렉터리에 저장합니다. 현재 드라이버는 connectAsync() 함수를 사용한 토큰 캐싱만 지원합니다.

캐시된 토큰을 다른 위치에 저장하려면 snowflake.createConnection() 함수의 credentialCacheDir 매개 변수에 원하는 위치를 지정하면 됩니다. 아래와 같이 상대 경로나 절대 경로를 지정할 수 있습니다.

  • 상대 경로

    const connection = snowflake.createConnection({
              credentialCacheDir: "../../<folder name>",
    });
    
    Copy
  • 절대 경로

    const connection = snowflake.createConnection({
              credentialCacheDir: "C:\\<folder name>\\<subfolder name>",
    });
    
    Copy

credentialCacheDir 을 구성하지 않으면, Snowflake Node.js 드라이버는 $HOME/temporary_credential.json 을 사용하여 자격 증명을 저장합니다.

사용자 지정 자격 증명 관리자 사용

Snowflake node.js 드라이버는 로컬 JSON 파일을 사용하여 자격 증명을 저장하는 기본 자격 증명 관리자를 제공합니다. 자격 증명 관리자가 명시적으로 구성되어 있지 않으면 드라이버는 이 기본 자격 증명 관리자를 사용합니다.

기본 자격 증명 관리자를 사용하지 않으려면 사용자 지정 자격 증명 관리자를 생성할 수 있습니다. 사용자 지정 자격 증명 관리자는 다음 요구 사항을 충족해야 합니다.

  • 최소한으로 read, writeremove 함수를 포함해야 합니다. 다른 함수도 포함시킬 수 있습니다.

  • object 데이터 타입이어야 합니다.

다음 예제에서는 최소한의 사용자 지정 자격 증명 관리자를 위한 템플릿을 보여줍니다.

const sampleCustomManager = {
  read: function (key) {
  //(do something with the key)
    return token;
  },
  write: function (key, token) {
  //(do something with the key and token)
  },
  remove: function (key) {
    //(do something with the key)
  }
};
Copy

사용자 지정 자격 증명 관리자를 완료한 후 다음과 같이 snowflake.configure() 메서드에서 드라이버에 대해 구성할 수 있습니다. 이 예제는 MFA 토큰을 반영하지만, SSO 토큰에 대한 사용자 지정 자격 증명 관리자를 생성할 수도 있습니다.

const myCredentialManager = require('<your custom credential manager module>')
const snowflake = require('snowflake-sdk');

snowflake.configure({
  customCredentialManager: myCredentialManager
})

const connection = snowflake.createConnection({
  account: process.env.SNOWFLAKE_TEST_ACCOUNT,
  database: process.env.SNOWFLAKE_TEST_DATABASE,
  schema: process.env.SNOWFLAKE_TEST_SCHEMA,
  warehouse: process.env.SNOWFLAKE_TEST_WAREHOUSE,
  authenticator: 'USERNAME_PASSWORD_MFA',
  clientRequestMFAToken: true,
});
Copy

Snowflake Node.js 드라이버는 사용자 지정 자격 증명 관리자를 구현하고 사용하기 위한 플러그인과 유사한 인터페이스를 제공하지만, Snowflake는 고객을 위한 사용자 지정 자격 증명 관리자의 생성, 구현 또는 지원에 대한 책임을 지지 않습니다.