Azure SQL 데이터베이스에서 암호 없는 연결을 사용하도록 애플리케이션 마이그레이션하기
적용 대상: Azure SQL Database
Azure SQL 데이터베이스에 대한 애플리케이션 요청을 인증해야 합니다. 여러 방식으로 Azure SQL 데이터베이스를 인증할 수 있지만 가능하면 암호 없는 애플리케이션 인증을 사용하는 것이 좋습니다. 암호 또는 비밀 키를 사용하는 기존의 인증 방법은 보안 위험과 복잡성을 야기합니다. 암호 없는 연결로 이동하는 이점에 대해 자세히 알아보려면 Azure 서비스에 대한 암호 없는 연결 허브를 방문하세요. 다음 자습서에서는 키 기반 솔루션 대신 암호 없는 연결을 사용하여 기존 Python 애플리케이션을 마이그레이션하여 Azure SQL 데이터베이스에 연결하는 방법을 설명합니다.
Azure SQL 데이터베이스 구성
암호 없는 연결은 Microsoft Entra 인증을 사용하여 Azure SQL 데이터베이스를 비롯한 Azure 서비스에 연결합니다. Microsoft Entra 인증을 사용하면 중앙 위치에서 ID를 관리할 수 있으므로 권한 관리가 간소화됩니다. SQL Database의 Microsoft Entra 인증 구성에 대해 자세히 알아 보세요.
이 마이그레이션 가이드의 경우 Azure SQL 데이터베이스에 Microsoft Entra 관리자가 할당되어 있는지를 확인해야 합니다.
논리 서버의 Microsoft Entra 페이지로 이동합니다.
관리자 설정을 선택하여 Microsoft Entra ID 플라이아웃 메뉴를 엽니다.
Microsoft Entra ID 플라이아웃 메뉴에서 관리자로 할당할 사용자를 검색합니다.
사용자를 선택한 다음 선택을 선택합니다.
로컬 개발 환경 구성
로컬 및 Azure 호스팅 환경 모두에서 작동하도록 암호 없는 연결을 구성할 수 있습니다. 이 섹션에서는 개별 사용자가 로컬 개발을 위해 Azure SQL 데이터베이스에 인증할 수 있도록 구성을 적용합니다.
Azure에 로그인
로컬 개발의 경우 Azure SQL 데이터베이스에 액세스하는 데 사용하고자 하는 계정과 동일한 Azure AD 계정으로 로그인해야 합니다. Azure CLI 또는 Azure PowerShell과 같은 인기 있는 개발 도구를 통해 인증할 수 있습니다. 인증할 수 있는 개발 도구는 언어에 따라 다릅니다.
다음 명령을 사용하여 Azure CLI를 통해 Azure에 로그인합니다.
az login
데이터베이스 사용자 계정 만들기 및 역할 할당
Azure SQL 데이터베이스에 사용자를 만듭니다. 사용자는 Azure 로그인 섹션에서 로컬로 로그인하는 데 사용한 Azure 계정에 해당해야 합니다.
Azure Portal에서 SQL Database로 이동하여 쿼리 편집기(미리 보기)를 선택합니다.
화면 오른쪽에서
<your-username>
(으)로 계속을 선택하여 데이터베이스에 로그인합니다.쿼리 편집기 보기에서 다음 T-SQL 명령을 실행합니다.
CREATE USER [user@domain] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [user@domain]; ALTER ROLE db_datawriter ADD MEMBER [user@domain]; ALTER ROLE db_ddladmin ADD MEMBER [user@domain]; GO
이러한 명령을 실행하면 SQL DB 기여자 역할이 특정한 계정에 할당됩니다. 이 역할의 ID는 데이터베이스의 데이터와 스키마를 읽고 쓰고 수정할 수 있습니다. 할당된 역할에 대한 자세한 내용은 고정 데이터베이스 역할을 참조하세요.
로컬 연결 구성 업데이트
Python SQL Driver - pyodbc를 사용하여 Azure SQL 데이터베이스에 연결하는 기존 애플리케이션 코드는 작은 수정만 거쳐도 암호 없는 연결에서 계속 작동합니다. 예를 들어 다음 코드는 로컬로 실행할 때와 Azure 앱 Service에 배포될 때 SQL 인증 및 암호 없는 연결에서 모두 작동합니다.
import os
import pyodbc, struct
from azure.identity import DefaultAzureCredential
connection_string = os.environ["AZURE_SQL_CONNECTIONSTRING"]
def get_all():
with get_conn() as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM Persons")
# Do something with the data
return
def get_conn():
credential = DefaultAzureCredential(exclude_interactive_browser_credential=False)
token_bytes = credential.get_token("https://database.windows.net/.default").token.encode("UTF-16-LE")
token_struct = struct.pack(f'<I{len(token_bytes)}s', len(token_bytes), token_bytes)
SQL_COPT_SS_ACCESS_TOKEN = 1256 # This connection option is defined by microsoft in msodbcsql.h
conn = pyodbc.connect(connection_string, attrs_before={SQL_COPT_SS_ACCESS_TOKEN: token_struct})
return conn
팁
이 예시 코드에서는 App Service 환경 변수 WEBSITE_HOSTNAME
(을)를 사용하여 코드가 실행 중인 환경을 결정합니다. 다른 배포 시나리오의 경우 다른 환경 변수를 사용하여 환경을 확인할 수 있습니다.
암호 없는 연결 문자열 형식을 사용하도록 로컬 개발을 위해 참조된 연결 문자열(AZURE_SQL_CONNECTIONSTRING
)을 업데이트하려면 다음을 수행하세요.
Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30
앱 테스트
앱을 로컬로 실행하고 Azure SQL 데이터베이스 연결이 예상대로 작동하는지 확인하세요. Azure 사용자 및 역할 변경 사항이 Azure 환경에 적용되는 데 몇 분이 걸릴 수 있습니다. 이제 개발자가 애플리케이션 내에서 비밀을 관리하지 않아도 로컬 및 프로덕션 환경 모두에서 실행되도록 애플리케이션이 구성되었습니다.
Azure 호스팅 환경 구성
애플리케이션이 암호 없는 연결을 사용하여 로컬에서 실행되도록 구성되면 Azure에 배포한 다음 동일한 코드로 Azure SQL 데이터베이스에 인증할 수 있습니다. 다음 섹션에서는 배포된 애플리케이션이 관리 ID를 사용하여 SQL Database에 연결하도록 구성하는 방법을 설명합니다. 관리 ID는 Microsoft Entra 인증을 지원하는 리소스에 연결할 때 애플리케이션이 사용할 수 있도록 Microsoft Entra ID(이전의 Azure Active Directory)에서 자동으로 관리 ID를 제공합니다. 관리 ID에 대해 자세히 알아보세요.
관리 ID 만들기
사용자가 할당한 관리 ID는 Azure Portal 또는 Azure CLI를 사용하여 만들 수 있습니다. 애플리케이션에서 ID를 사용하여 다른 서비스에 인증합니다.
- Azure Portal의 위쪽에서 관리 ID를 검색합니다. 관리 ID 결과를 선택합니다.
- 관리 ID 개요 페이지의 위쪽에서 + 만들기를 선택합니다.
- 기본 사항 탭에서 다음 값을 입력합니다.
- 구독: 원하는 구독을 선택합니다.
- 리소스 그룹: 원하는 리소스 그룹을 선택합니다.
- 지역: 자신의 위치 근처 지역을 선택합니다.
- 이름: 인식할 수 있는 ID 이름(예: MigrationIdentity)을 입력합니다.
- 페이지 아래쪽에서 검토 + 만들기를 선택합니다.
- 유효성 검사가 완료되면 만들기를 선택합니다. Azure에서 사용자가 할당한 ID를 새로 만듭니다.
리소스가 만들어지면 리소스로 이동을 선택하여 관리 ID의 세부 정보를 확인합니다.
관리 ID를 웹앱과 연결
만든 사용자 할당 관리 ID를 사용하도록 웹앱을 구성해야 합니다.
Azure Portal에서 다음 단계를 완료하여 사용자가 할당한 ID를 앱과 연결합니다. 이러한 동일한 단계가 적용되는 Azure 서비스는 다음과 같습니다.
- Azure Spring Apps
- Azure Container Apps
- Azure 가상 머신
- Azure Kubernetes Service
- 웹앱의 개요 페이지로 이동합니다.
ID용 데이터베이스 사용자 계정 만들기 및 역할 할당
SQL 데이터베이스 사용자를 만들어 사용자가 할당한 관리 ID에 다시 매핑될 수 있도록 설정합니다. 앱이 데이터베이스의 데이터와 스키마를 읽고 쓰고 수정할 수 있도록 사용자에게 필요한 SQL 역할을 할당합니다.
Azure Portal에서 SQL Database로 이동하여 쿼리 편집기(프리뷰)를 선택합니다.
화면 오른쪽에서
<username>
(으)로 계속을 선택하여 데이터베이스에 로그인합니다.쿼리 편집기 보기에서 다음 T-SQL 명령을 실행합니다.
CREATE USER [user-assigned-identity-name] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [user-assigned-identity-name]; ALTER ROLE db_datawriter ADD MEMBER [user-assigned-identity-name]; ALTER ROLE db_ddladmin ADD MEMBER [user-assigned-identity-name]; GO
이러한 명령을 실행하면 SQL DB 기여자 역할이 사용자 할당 관리 ID에 할당됩니다. 이 역할의 ID는 데이터베이스의 데이터와 스키마를 읽고 쓰고 수정할 수 있습니다.
Important
기업 제품 프로덕션 환경에서 데이터베이스 사용자 역할을 할당할 때는 주의해야 합니다. 이러한 시나리오에서 앱은 상승된 단일 ID를 사용하여 모든 작업을 수행해서는 안 됩니다. 특정 작업에 대한 특정 권한으로 여러 ID를 구성하여 최소 권한 원칙을 구현하는 것을 권장합니다.
다음 리소스에서 데이터베이스 역할 및 보안을 구성하는 방법에 대해 자세히 알아 보세요.
연결 문자열 업데이트
암호 없는 연결 문자열 형식을 사용하도록 Azure 앱 구성을 업데이트하세요. 형식은 로컬 환경에서 사용되는 것과 동일해야 합니다.
연결 문자열은 일반적으로 앱 호스팅 환경에서 환경 변수로 저장됩니다. 다음 지침은 주로 App Service에 대해 다루고 있지만, 다른 Azure 호스팅 서비스도 유사한 구성을 제공합니다.
Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30
<database-server-name>
(은)는 Azure SQL 데이터베이스 서버의 이름이며 <database-name>
(은)는 Azure SQL 데이터베이스의 이름입니다.
관리 ID 클라이언트 ID에 대한 앱 설정 만들기
사용자가 할당한 관리 ID를 사용하려면 환경 변수를 만들고 관리 ID의 클라이언트 ID와 동일하게 설정합니다. 이 변수는 Azure Portal에서 앱의 구성 섹션에서 설정할 수 있습니다. Azure Portal 관리 ID 리소스 개요 섹션에서 클라이언트 ID를 찾을 수 있습니다.
변경 내용을 저장한 다음, 애플리케이션이 자동으로 다시 시작하지 않으면 애플리케이션을 다시 시작합니다.
참고 항목
이 마이그레이션 가이드에 표시된 연결 코드 예시에서는 배포 시 DefaultAzureCredential 클래스를 사용합니다. 특히 여기서는 사용자가 할당한 관리 ID 클라이언트 ID를 생성자에 전달하지 않고 DefaultAzureCredential을 사용합니다. 이 시나리오에서 Fallback은 AZURE_CLIENT_ID 환경 변수를 확인하는 것입니다. AZURE_CLIENT_ID 환경 변수가 없으면 구성된 경우 시스템이 할당한 관리 ID가 사용됩니다.
DefaultAzureCredential 생성자에서 관리 ID 클라이언트 ID를 전달하는 경우 인증 프로세스가 로컬 시나리오에서 대화형 인증으로 되돌아가므로 연결 코드를 로컬로 사용하고 배포할 수 있습니다. 자세한 내용은 Python용 Azure Identity 클라이언트 라이브러리를 참조하세요.
애플리케이션 테스트
그런 다음 앱을 테스트하고 모두 잘 작동하는지 확인해 주세요. 모든 변경 내용이 Azure 환경에 적용되는 데는 몇 분 정도 걸릴 수 있습니다.
다음 단계
이 자습서에서는 애플리케이션을 암호 없는 연결로 마이그레이션하는 방법을 알아보았습니다.
다음 리소스를 참조하여 이 문서에서 설명하는 개념을 자세히 살펴볼 수 있습니다.