안녕하세요! 이번 글에서는 GCP Cloud Storage의 Signed URL 기능에 대해 깊이 있게 알아보겠습니다. 이 기능은 특정 기간 동안 객체에 대한 특별한 접근을 허용해 보안성과 유연성을 동시에 제공합니다. 활용 예제와 함께 권장 보안 설정까지 다룰 테니, Signed URL을 처음 사용하는 분들께 큰 도움이 되기를 바랍니다.
1. GCP Signed URL 개요
GCP Cloud Storage의 Signed URL은 특정 기간 동안 사용자에게 공개적으로 접근이 허용된 URL을 생성하여 비공개 객체를 공유할 수 있도록 합니다. 예를 들어 파일 공유, 제한된 접근이 필요한 파일 다운로드 등에서 유용하게 사용됩니다.
주요 특징
• 만료 시간 설정: 기본값은 없으며, 최대 7일(604,800초)까지 설정 가능합니다.
• 인증 방식: 서비스 계정 키 또는 IAM Credentials를 이용해 서명
• 제한 사항: HTTP 메서드 제한 가능, IP 주소 제한 가능 등 다양한 보안 조치 지원
2. 다양한 Signed URL 생성 방법
Signed URL은 프로그래밍 언어별 SDK나 gsutil 명령어를 통해 쉽게 생성할 수 있습니다. 여기에서는 Python, Node.js, 그리고 gsutil을 활용한 예시를 소개하겠습니다.
예제 1) Python을 사용한 Signed URL 생성
from google.cloud import storage
import datetime
def generate_signed_url(bucket_name, blob_name):
storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
blob = bucket.blob(blob_name)
url = blob.generate_signed_url(
version="v4",
expiration=datetime.timedelta(hours=1), # 만료 시간: 1시간
method="GET",
)
return url
Python SDK 설치: pip install google-cloud-storage
예제 2) Node.js를 사용한 Signed URL 생성
const {Storage} = require('@google-cloud/storage');
const storage = new Storage();
async function generateSignedUrl(bucketName, fileName) {
const options = {
version: 'v4',
action: 'read',
expires: Date.now() + 1000 * 60 * 60, // 1시간
};
const [url] = await storage
.bucket(bucketName)
.file(fileName)
.getSignedUrl(options);
return url;
}
Node.js SDK 설치: npm install --save @google-cloud/storage
예제 3) gsutil을 사용한 Signed URL 생성
gsutil CLI로도 쉽게 Signed URL을 생성할 수 있습니다. 다음 명령어를 통해 1시간 동안 유효한 Signed URL을 생성할 수 있습니다.
gsutil signurl -d 1h service-account-key.json gs://bucket-name/object-name
3. V4 Signed URL 구성 요소
Signed URL은 URL에 서명된 인증 정보를 포함해 URL 자체로 객체에 접근 권한을 부여합니다.
생성된 URL의 예시를 통해 구성 요소를 살펴보겠습니다:
https://storage.googleapis.com/BUCKET_NAME/OBJECT_NAME?
X-Goog-Algorithm=GOOG4-RSA-SHA256&
X-Goog-Credential=SERVICE_ACCOUNT_EMAIL%2FYYYYMMDD%2Fauto%2Fstorage%2Fgoog4_request&
X-Goog-Date=YYYYMMDDTHHMMSSZ&
X-Goog-Expires=SEC_FROM_EPOCH&
X-Goog-SignedHeaders=host&
X-Goog-Signature=SIGNATURE_VALUE
• X-Goog-Credential: 서비스 계정 이메일 및 서명 요청 정보
• X-Goog-Expires: 만료 시간 (초 단위)
• X-Goog-Signature: 요청을 서명하여 유효성을 검증하는 값
4. Signed URL 만들기 전 필수 설정
Signed URL을 만들기 위해서는 GCP에서 서비스 계정을 생성하고 권한을 설정해야 합니다.
1) 서비스 계정 설정
gcloud iam service-accounts keys create key.json \
--iam-account=service-account@project-id.iam.gserviceaccount.com
2) IAM 권한 설정
Signed URL을 사용하려면 스토리지 객체에 대한 권한이 필요합니다.
필요한 권한은 다음과 같습니다:
• roles/storage.objectViewer: 읽기 전용 권한
• roles/storage.objectCreator: 쓰기 권한 (업로드 시 필요)
5. 보안 고려사항
Signed URL을 사용할 때는 적절한 보안 설정을 통해 접근을 최소화하는 것이 중요합니다.
1) 만료 시간 설정
• 최대 7일까지 설정할 수 있으나, 보안을 위해 필요한 최소한의 시간만 설정하는 것을 권장합니다.
2) HTTP 메서드 제한
• 특정 HTTP 메서드(GET, PUT, DELETE 등)만 허용하여 URL 사용 목적을 명확히 합니다.
3) IP 주소 제한
• 특정 IP 주소 또는 IP 범위만 접근할 수 있도록 제한할 수 있습니다.
4) 서비스 계정 키 관리
• 키 로테이션 주기를 설정하여 주기적으로 새로운 키를 생성하고, 이전 키를 폐기합니다.
• 안전한 키 보관을 위해 키 파일을 안전한 위치에 저장하고 권한 있는 사용자만 접근할 수 있도록 제한합니다.
6. AWS S3 Pre-signed URL과의 차이점
1) 만료 시간
• AWS S3: 기본 15분, 최대 7일
• GCP Cloud Storage: 기본 없음, 최대 7일 (필수 지정)
2) 인증 방식
• AWS S3: IAM 자격 증명 (IAM User, Role)
• GCP Cloud Storage: 서비스 계정 키 또는 서명된 IAM 자격 증명
3) 서명 버전
• AWS S3: SigV4
• GCP Cloud Storage: V4 서명
7. 실용적인 사용 사례
사례 1) 파일 다운로드 및 업로드
• 사용자에게 특정 파일의 다운로드 링크를 제공하거나, 파일 업로드를 허용하는 상황에서 Signed URL을 사용하면 URL의 만료 시간 이후에는 접근할 수 없게 되어 보안을 유지할 수 있습니다.
사례 2) 비공개 파일 공유
• 계약서, 개인 정보가 포함된 파일 등 보안이 필요한 파일을 공유할 때 Signed URL을 사용하여 짧은 기간 동안만 접근을 허용할 수 있습니다.
사례 3) 대용량 파일 전송
• 대용량 데이터를 처리할 때 서버의 부하를 줄이기 위해 Signed URL을 생성하여 GCP Storage를 통해 직접 전송을 유도할 수 있습니다.
8. 모범 사례
1. 최소한의 권한 부여: 서비스 계정에는 필요한 최소한의 권한만 부여하여 보안을 강화합니다.
2. 정기적인 키 관리: 서비스 계정 키는 정기적으로 로테이션하여 보안성을 유지합니다.
3. 만료 시간 조정: 가능한 짧은 만료 시간을 설정하여 불필요한 접근을 최소화합니다.
결론
GCP Cloud Storage의 Signed URL은 유연한 접근 제어를 제공하여 중요한 파일의 공유나 데이터 처리에 유용하게 사용됩니다. 다양한 방법과 설정을 통해 보안을 강화하면서 효율적으로 사용할 수 있습니다.
이번 글을 통해 Signed URL의 기본 개념부터 보안 최적화까지 다룰 수 있었기를 바랍니다.
참조 링크:
• 공식 GCP Cloud Storage Signed URL 문서
궁금한 점이나 추가적으로 알고 싶은 사항은 언제든지 댓글로 남겨 주세요! 😊
'IT > GCP' 카테고리의 다른 글
[GCP] Gemini (1) | 2024.11.27 |
---|---|
[GCP] Gemini Pro와 Gemini Pro Advanced의 차이 (0) | 2024.11.25 |
[GCP] Cloud Run을 활용한 Palm 2 챗봇 만들기 (0) | 2023.12.31 |
[Google Cloud] Generative AI Live + Labs Seoul#1 (115) | 2023.09.24 |
Bigquery 실행 결과를 GCS로 자동 업데이트 (3) | 2023.09.09 |