Microsoft Entra 인증을 사용하여 연결

PHP 드라이버 다운로드

Microsoft Entra IDSQL Server 인증의 대안으로 작동하는 중앙 사용자 ID 관리 기술입니다. Microsoft Entra ID를 사용하면 사용자 이름과 비밀번호, Windows 통합 인증 또는 Microsoft Entra 액세스 토큰을 사용하여 Microsoft Entra ID의 페더레이션 ID로 Azure SQL 데이터베이스, Azure SQL Managed Instance 및 Azure Synapse Analytics에 연결할 수 있습니다. SQL Server용 PHP 드라이버는 이러한 기능을 일부 지원합니다.

Microsoft Entra 인증을 사용하려면 먼저 Azure SQL을 사용하여 Microsoft Entra 인증을 구성하고 관리해야 합니다.

Microsoft Entra ID를 사용하려면 다음 테이블에 나와 있는 것처럼 인증 또는 AccessToken 키워드를 사용합니다(함께 사용할 수 없음). 자세한 기술 정보는 ODBC 드라이버에서 Microsoft Entra ID 사용을 참조하세요.

키워드 설명
AccessToken 설정되지 않음(기본값) 다른 키워드에 의해 결정되는 인증 모드입니다. 자세한 내용은 Connection Options을 참조하세요.
바이트 문자열 OAuth JSON 응답에서 추출된 Microsoft Entra 액세스 토큰입니다. 연결 문자열에는 사용자 ID, 비밀번호 또는 Authentication 키워드가 포함되지 않아야 합니다(Linux 또는 macOS의 경우 ODBC 드라이버 버전 17 이상 필요).
인증 설정되지 않음(기본값) 다른 키워드에 의해 결정되는 인증 모드입니다. 자세한 내용은 Connection Options을 참조하세요.
SqlPassword 사용자 이름 및 비밀번호를 사용하여 SQL Server 인스턴스(Azure 인스턴스일 수 있음)에 직접 인증합니다. UIDPWD 키워드로 사용자 이름과 암호를 연결 문자열에 전달해야 합니다.
ActiveDirectoryPassword 사용자 이름 및 비밀번호를 사용하여 Microsoft Entra ID로 인증합니다. UIDPWD 키워드로 사용자 이름과 암호를 연결 문자열에 전달해야 합니다.
ActiveDirectoryMsi Microsoft Entra 시스템에서 할당된 사용자 할당 관리 ID를 사용하여 인증합니다(ODBC 드라이버 버전 17.3.1.1 이상 필요). 개요와 자습서는 Azure 리소스에 대한 관리 ID란?을 참조하세요.
ActiveDirectoryServicePrincipal 서비스 주체 개체를 사용하여 인증(ODBC Driver 버전 17.7 이상 필요). 자세한 내용과 예시는 Microsoft Entra ID의 애플리케이션 및 서비스 주체 개체를 참조하세요.

인증 키워드는 연결 보안 설정에 영향을 줍니다. 연결 문자열에 설정된 경우 기본적으로 Encrypt 키워드는 true로 설정되며, 이는 클라이언트가 암호화를 요청한다는 의미입니다. 또한 TrustServerCertificate를 true(기본값은 false)로 설정한 경우를 제외하고 암호화 설정에 관계없이 서버 인증서의 유효성이 검사됩니다. 이 기능은 연결 문자열에 암호화가 특별히 요청된 경우에만 서버 인증서의 유효성을 검사하는 기존의 덜 안전한 로그인 방법과 구별됩니다.

제한 사항

Windows의 경우 기본 ODBC 드라이버는 Authentication 키워드에 대해 ActiveDirectoryIntegrated라는 값을 1개 더 지원하지만, PHP 드라이버는 어떤 플랫폼에서도 이 값을 지원하지 않습니다.

예시 - SqlPassword 및 ActiveDirectoryPassword를 사용하여 연결

<?php
// First connect to a local SQL Server instance by setting Authentication to SqlPassword
$serverName = "myserver.mydomain";

$connectionInfo = array("UID"=>$myusername, "PWD"=>$mypassword, "Authentication"=>'SqlPassword');

$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
    echo "Could not connect with Authentication=SqlPassword.\n";
    print_r(sqlsrv_errors());
} else {
    echo "Connected successfully with Authentication=SqlPassword.\n";
    sqlsrv_close($conn);
}

// Now connect to an Azure SQL database by setting Authentication to ActiveDirectoryPassword
$azureServer = "myazureserver.database.windows.net";
$azureDatabase = "myazuredatabase";
$azureUsername = "myuid";
$azurePassword = "mypassword";
$connectionInfo = array("Database"=>$azureDatabase,
                        "UID"=>$azureUsername,
                        "PWD"=>$azurePassword,
                        "Authentication"=>'ActiveDirectoryPassword');

$conn = sqlsrv_connect($azureServer, $connectionInfo);
if ($conn === false) {
    echo "Could not connect with Authentication=ActiveDirectoryPassword.\n";
    print_r(sqlsrv_errors());
} else {
    echo "Connected successfully with Authentication=ActiveDirectoryPassword.\n";
    sqlsrv_close($conn);
}

?>

예시 - PDO_SQLSRV 드라이버를 사용하여 연결

<?php
// First connect to a local SQL Server instance by setting Authentication to SqlPassword
$serverName = "myserver.mydomain";

$connectionInfo = "Database = $databaseName; Authentication = SqlPassword;";

try {
    $conn = new PDO("sqlsrv:server = $serverName ; $connectionInfo", $myusername, $mypassword);
    echo "Connected successfully with Authentication=SqlPassword.\n";
    $conn = null;
} catch (PDOException $e) {
    echo "Could not connect with Authentication=SqlPassword.\n";
    print_r($e->getMessage());
    echo "\n";
}

// Now connect to an Azure SQL database by setting Authentication to ActiveDirectoryPassword
$azureServer = "myazureserver.database.windows.net";
$azureDatabase = "myazuredatabase";
$azureUsername = "myuid";
$azurePassword = "mypassword";
$connectionInfo = "Database = $azureDatabase; Authentication = ActiveDirectoryPassword;";

try {
    $conn = new PDO("sqlsrv:server = $azureServer ; $connectionInfo", $azureUsername, $azurePassword);
    echo "Connected successfully with Authentication=ActiveDirectoryPassword.\n";
    unset($conn);
} catch (PDOException $e) {
    echo "Could not connect with Authentication=ActiveDirectoryPassword.\n";
    print_r($e->getMessage());
    echo "\n";
}
?>

예시 - Microsoft Entra 액세스 토큰을 사용하여 연결

SQLSRV 드라이버

<?php
// Using an access token to connect: do not use UID or PWD connection options
// Assume $accToken is the valid byte string extracted from an OAuth JSON response
$connectionInfo = array("Database"=>$azureAdDatabase, "AccessToken"=>$accToken);
$conn = sqlsrv_connect($azureAdServer, $connectionInfo);
if ($conn === false) {
    echo "Could not connect with Azure AD Access Token.\n";
    print_r(sqlsrv_errors());
} else {
    echo "Connected successfully with Azure AD Access Token.\n";
    sqlsrv_close($conn);
}
?>

PDO_SQLSRV 드라이버

<?php
try {
    // Using an access token to connect: do not pass in $uid or $pwd
    // Assume $accToken is the valid byte string extracted from an OAuth JSON response
    $connectionInfo = "Database = $azureAdDatabase; AccessToken = $accToken;";
    $conn = new PDO("sqlsrv:server = $azureAdServer; $connectionInfo");
    echo "Connected successfully with Azure AD Access Token\n";
    unset($conn);
} catch (PDOException $e) {
    echo "Could not connect with Azure AD Access Token.\n";
    print_r($e->getMessage());
    echo "\n";
}
?>

예시 - Azure 리소스에 대한 관리 ID를 사용하여 연결

SQLSRV 드라이버를 사용하여 시스템이 할당한 관리 ID 사용

시스템 할당 관리 ID를 사용하여 연결할 때는 UID 또는 PWD 옵션을 사용하지 말아야 합니다.

<?php

$azureServer = 'myazureserver.database.windows.net';
$azureDatabase = 'myazuredatabase';
$connectionInfo = array('Database'=>$azureDatabase,
                        'Authentication'=>'ActiveDirectoryMsi');
$conn = sqlsrv_connect($azureServer, $connectionInfo);

if ($conn === false) {
    echo "Could not connect with Authentication=ActiveDirectoryMsi (system-assigned).\n";
    print_r(sqlsrv_errors());
} else {
    echo "Connected successfully with Authentication=ActiveDirectoryMsi (system-assigned).\n";
    
    $tsql = "SELECT @@Version AS SQL_VERSION";
    $stmt = sqlsrv_query($conn, $tsql);
    if ($stmt === false) {
        echo "Failed to run the simple query (system-assigned).\n";
        print_r(sqlsrv_errors());
    } else {
        while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
            echo $row['SQL_VERSION'] . PHP_EOL;
        }

        sqlsrv_free_stmt($stmt);
    }
    
    sqlsrv_close($conn);
}
?>

예시 - Microsoft Entra 서비스 주체를 사용하여 연결

서비스 주체 개체를 사용하여 인증하려면 해당 애플리케이션 클라이언트 ID클라이언트 암호가 필요합니다.

SQLSRV 드라이버

<?php

$adServer = 'myazureserver.database.windows.net';
$adDatabase = 'myazuredatabase';
$adSPClientId = 'myAppClientId';
$adSPClientSecret = 'myClientSecret';

$conn = false;
$connectionInfo = array("Database"=>$adDatabase, 
                        "Authentication"=>"ActiveDirectoryServicePrincipal",
                        "UID"=>$adSPClientId,
                        "PWD"=>$adSPClientSecret);

$conn = sqlsrv_connect($adServer, $connectionInfo);
if ($conn === false) {
    echo "Could not connect using Azure AD Service Principal." . PHP_EOL;
    print_r(sqlsrv_errors());
}

sqlsrv_close($conn);

?>

PDO_SQLSRV 드라이버

<?php

$adServer = 'myazureserver.database.windows.net';
$adDatabase = 'myazuredatabase';
$adSPClientId = 'myAppClientId';
$adSPClientSecret = 'myClientSecret';

$conn = false;
try {
    $connectionInfo = "Database = $adDatabase; Authentication = ActiveDirectoryServicePrincipal;";
    $conn = new PDO("sqlsrv:server = $adServer; $connectionInfo", $adSPClientId, $adSPClientSecret);
} catch (PDOException $e) {
    echo "Could not connect using Azure AD Service Principal.\n";
    print_r($e->getMessage());
    echo PHP_EOL;
}

unset($conn);
?>

참고 항목

ODBC 드라이버와 함께 Microsoft Entra ID 사용

Azure 리소스용 관리 ID란?