서비스 계정의 키를 사용하여 Cloud Functions의 HTTP 엔드포인트를 호출하는 방법은?
_____A1: 서비스 계정 키를 사용하여 Cloud Functions의 HTTP 엔드포인트를 호출하려면, 서비스 계정 키(JSON 형식)를 기반으로 액세스 토큰을 생성하고 이 토큰을 HTTP 요청의 Authorization 헤더에 포함시켜야 합니다.
Q2: 서비스 계정 키에서 액세스 토큰을 생성하는 방법은 무엇인가요?
A2: 일반적으로 Google OAuth2 라이브러리나 `gcloud` CLI, 혹은 Google API 클라이언트를 사용하여 JWT(JSON Web Token)를 생성하고 Google OAuth2 토큰 엔드포인트에 교환 요청을 보내어 액세스 토큰을 발급받습니다. Python, Node.js, Go 등 다양한 언어용 라이브러리가 존재합니다.
예를 들어, Python에서는 google-auth 라이브러리를 사용하여 다음과 같이 액세스 토큰을 얻을 수 있습니다:
```python
from google.oauth2 import service_account
import google.auth.transport.requests
SCOPES = ['https://www.googleapis.com/auth/cloud-platform']
SERVICE_ACCOUNT_FILE = 'path/to/service-account.json'
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
request = google.auth.transport.requests.Request()
credentials.refresh(request)
access_token = credentials.token
```
Q3: 얻은 액세스 토큰을 HTTP 호출에 어떻게 사용하나요?
A3: 액세스 토큰을 HTTP 요청의 헤더에 다음과 같이 추가합니다:
```
Authorization: Bearer <액세스_토큰>
```
Q4: 호출 예시는 어떻게 되나요?
A4: curl 예시:
```bash
curl -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME
```
서비스 계정 키 기반으로 토큰을 획득할 경우 프로그래밍 언어 내에서 위 A2 내용처럼 토큰을 추출 후 헤더에 포함시켜 호출합니다.
Q5: Cloud Functions가 서비스 계정에 의해 호출되도록 설정하려면 무엇을 해야 하나요?
A5: 해당 Cloud Function의 실행 권한이 서비스 계정에 부여되어 있어야 합니다. 즉, 서비스 계정에게 `Cloud Functions Invoker` 역할이 부여되어 있어야 하며, 함수가 IAM 인증을 요구하도록 설정되어야 합니다.
Q6: 서비스 계정 키를 이용한 호출 시 주의사항은 무엇인가요?
A6:
- 키 파일(JSON)을 안전하게 관리해야 하며, 노출되지 않도록 해야 합니다.
- 키 파일 대신 Workload Identity Federation이나 OAuth Client를 쓰는 등 보안모델을 고려하는 것이 좋습니다.
- 토큰은 유효기간이 있으므로 주기적으로 갱신해야 합니다.
- 함수가 공개 HTTP 함수(익명 호출 가능)이면 인증 헤더가 필요 없습니다.
요약:
1. 서비스 계정 키로 액세스 토큰 생성
2. 토큰을 Authorization 헤더에 포함하여 HTTP 요청 전송
3. Cloud Functions 함수에 서비스 계정에 Invoker 권한 부여 및 IAM 인증 설정 필요
4. 보안에 유의하며 키 관리 및 토큰 갱신 수행
이 과정을 통해 서비스 계정 키를 이용해 인증된 상태로 Cloud Functions HTTP 엔드포인트를 안전하게 호출할 수 있습니다.
서비스 계정의 키를 사용하여 Cloud Functions의 HTTP 엔드포인트를 호출하는 방법은 다음과 같은 단계로 진행됩니다.
1. 서비스 계정 생성 및 키 다운로드 1. Google Cloud Console에 로그인 : [Google Cloud Console](https://console.cloud.google.com/)에 로그인합니다.
2. 프로젝트 선택 : Cloud Functions를 배포할 프로젝트를 선택합니다.
3. IAM 및 관리자 : 왼쪽 사이드바에서 "IAM 및 관리자"를 클릭한 후 "서비스 계정"을 선택합니다.
4. 서비스 계정 생성 : - "서비스 계정 만들기" 버튼을 클릭합니다.
- 서비스 계정의 이름과 설명을 입력하고 "만들기"를 클릭합니다.
- 필요한 역할을 선택합니다.
Cloud Functions에 접근할 수 있는 권한을 부여하기 위해 "Cloud Functions Invoker" 역할을 추가합니다.
- "완료"를 클릭하여 서비스 계정을 생성합니다.
5. 키 생성 : - 생성한 서비스 계정을 클릭하고 "키" 탭으로 이동합니다.
- "키 추가" 버튼을 클릭한 후 "새 키 만들기"를 선택합니다.
- JSON 형식의 키를 선택하고 "만들기"를 클릭합니다.
이때 다운로드된 JSON 파일은 안전하게 보관해야 합니다.
2. Cloud Functions 배포 1. Cloud Functions 배포 : Cloud Functions를 배포합니다.
이때 HTTP 트리거를 설정합니다.
예를 들어, 다음과 같은 명령어를 사용할 수 있습니다.
```bash gcloud functions deploy YOUR_FUNCTION_NAME \ --runtime nodejs14 \ --trigger-http \ --allow-unauthenticated ``` `--allow-unauthenticated` 플래그를 사용하면 인증 없이도 함수에 접근할 수 있지만, 서비스 계정을 사용하여 호출할 경우 이 플래그는 필요하지 않습니다.
3. HTTP 엔드포인트 호출 서비스 계정의 키를 사용하여 Cloud Functions의 HTTP 엔드포인트를 호출하기 위해서는 JWT(JSON Web Token)를 생성하고 이를 사용하여 인증을 수행해야 합니다.
3.1 JWT 생성 JWT를 생성하기 위해 `google-auth-library`와 같은 라이브러리를 사용할 수 있습니다.
Node.js를 예로 들어 설명하겠습니다.
1. 라이브러리 설치 : ```bash npm install google-auth-library ```
2. JWT 생성 및 HTTP 요청 : 아래는 JWT를 생성하고 Cloud Functions의 HTTP 엔드포인트를 호출하는 예제 코드입니다.
```javascript const { GoogleAuth } = require('google-auth-library'); const axios = require('axios'); async function callCloudFunction() { const auth = new GoogleAuth({ keyFile: 'path/to/your/service-account-key.json', // 서비스 계정 키 파일 경로 scopes: 'https://www.googleapis.com/auth/cloud-platform', }); const client = await auth.getClient(); const url = 'https://REGION-PROJECT_ID.cloudfunctions.net/YOUR_FUNCTION_NAME'; // Cloud Function URL const token = await client.getAccessToken(); const response = await axios.get(url, { headers: { Authorization: `Bearer ${token}`, }, }); console.log(response.data); } callCloudFunction().catch(console.error); ```
4. 이와 같이 서비스 계정의 키를 사용하여 Cloud Functions의 HTTP 엔드포인트를 호출할 수 있습니다.
이 과정에서 JWT를 생성하고 이를 사용하여 인증을 수행하는 것이 핵심입니다.
이를 통해 보안적으로 안전하게 Cloud Functions를 호출할 수 있으며, 필요한 경우 추가적인 권한을 설정하여 더욱 세밀한 접근 제어를 할 수 있습니다.
작성자:
정재훈 [비회원]
| 작성일자: 1년 전
2024-12-18 16:51:58
조회수: 144 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 144 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.