https://docs.aws.amazon.com/s3/

 

Amazon S3(Simple Storage Service)는 업계 최고 수준의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스입니다. 파일을 "객체(Object)" 형태로 "버킷(Bucket)"이라는 컨테이너에 저장하며, 웹 인터페이스나 API를 통해 언제 어디서든 원하는 양의 데이터를 저장하고 검색할 수 있습니다.

 

S3 버킷의 주요 사용 사례

S3는 그 유연성과 강력한 기능 덕분에 다양한 워크로드와 시나리오에서 활용됩니다.

  1. 웹사이트 호스팅 (정적 웹사이트)
    • HTML, CSS, JavaScript, 이미지 등 정적 웹 콘텐츠를 S3 버킷에 직접 호스팅할 수 있습니다. 이는 서버를 별도로 관리할 필요가 없어 비용 효율적이고 확장성이 뛰어납니다.
    • CloudFront와 연동하여 CDN(콘텐츠 전송 네트워크)을 통해 사용자에게 더 빠른 응답 속도를 제공할 수 있습니다.
  2. 데이터 백업 및 재해 복구 (Backup & Disaster Recovery)
    • 중요한 데이터를 S3에 백업하여 안전하게 보관하고, 재해 발생 시 빠르게 복구할 수 있습니다. S3는 높은 내구성(99.999999999%)과 가용성을 제공하여 데이터 손실 위험을 최소화합니다.
    • 버전 관리(Versioning) 기능을 사용하여 실수로 인한 삭제나 덮어쓰기로부터 데이터를 보호할 수 있습니다.
    • 교차 리전 복제(Cross-Region Replication)를 통해 다른 AWS 리전으로 데이터를 자동으로 복제하여 재해 복구 전략을 강화할 수 있습니다.
  3. 애플리케이션 데이터 스토리지
    • 모바일 앱, 웹 앱, 엔터프라이즈 애플리케이션 등 다양한 애플리케이션에서 생성되는 사용자 생성 콘텐츠(사진, 비디오), 로그 파일, 문서, 미디어 파일 등을 저장하는 데 사용됩니다.
    • 무한대에 가까운 확장성을 제공하므로 데이터 증가에 대한 걱정 없이 사용할 수 있습니다.
  4. 빅 데이터 분석 및 데이터 레이크
    • 페타바이트에서 엑사바이트 규모의 대량 데이터를 S3에 저장하고, AWS Lake Formation, Amazon Athena, Amazon Redshift Spectrum, EMR과 같은 다른 AWS 분석 서비스와 통합하여 데이터를 분석하고 통찰력을 얻는 데 활용됩니다.
    • S3는 "데이터 레이크"의 기반 스토리지로 가장 널리 사용됩니다.
  5. 콘텐츠 배포 (Content Delivery)
    • 소프트웨어 업데이트, 미디어 파일(오디오, 비디오), 문서 등 다양한 디지털 콘텐츠를 최종 사용자에게 효율적으로 배포하는 데 사용됩니다.
    • CloudFront와 함께 사용하여 전 세계 엣지 로케이션을 통해 콘텐츠를 캐싱하고 빠르게 전송할 수 있습니다.
  6. 아카이빙 (Archiving)
    • 장기간 보관해야 하지만 자주 액세스할 필요가 없는 데이터(규제 준수를 위한 기록, 오래된 로그)를 S3 Glacier 또는 S3 Glacier Deep Archive와 같은 저렴한 스토리지 클래스에 보관하여 비용을 절감할 수 있습니다.
    • S3 수명 주기 정책(Lifecycle Policy)을 설정하여 데이터가 일정 기간이 지나면 자동으로 더 저렴한 스토리지 클래스로 이동하도록 할 수 있습니다.
  7. IoT 데이터 저장
    • IoT 장치에서 수집되는 대량의 센서 데이터, 로그 등을 S3에 저장하고 이후 분석을 위해 활용할 수 있습니다.

 

S3 버킷 사용 시 주의할 점

S3는 강력한 서비스이지만, 몇 가지 중요한 주의 사항을 염두에 두어야 합니다.

  1. 보안 및 액세스 제어 (가장 중요!)
    • 공개 액세스 주의: S3 버킷은 기본적으로 비공개(Private)이며, 특정 권한이 부여된 사용자만 접근할 수 있습니다. 절대로 민감한 데이터를 저장하는 버킷에 퍼블릭 액세스를 허용해서는 안 됩니다. 의도치 않게 버킷을 공개 설정하여 데이터 유출 사고가 빈번하게 발생하므로, "Block Public Access" 설정을 기본적으로 활성화하고 필요한 경우에만 최소한의 범위로 해제해야 합니다.
    • IAM 정책 및 버킷 정책: IAM 사용자/역할 정책과 S3 버킷 정책을 사용하여 누가 어떤 조건으로 버킷 내의 객체에 접근할 수 있는지 세밀하게 제어해야 합니다. 최소 권한 원칙(Least Privilege)을 철저히 준수하세요.
    • ACL(Access Control List) 사용 지양: 객체 및 버킷 수준의 접근 제어를 위해 ACL을 사용할 수 있지만, IAM 정책과 버킷 정책이 더 강력하고 중앙 집중적인 제어를 제공하므로 ACL 대신 정책 사용을 권장합니다.
    • 암호화: 전송 중인 데이터(in transit)와 저장된 데이터(at rest) 모두 암호화하는 것을 강력히 권장합니다. S3는 서버 측 암호화(SSE-S3, SSE-KMS, SSE-C)를 제공하며, 기본 암호화 설정을 활성화하는 것이 좋습니다.
  2. 비용 관리
    • 스토리지 클래스 선택: S3는 S3 Standard, S3 Intelligent-Tiering, S3 Standard-IA, S3 One Zone-IA, S3 Glacier Instant Retrieval, S3 Glacier Flexible Retrieval, S3 Glacier Deep Archive 등 다양한 스토리지 클래스를 제공합니다. 데이터의 액세스 빈도와 보관 기간에 따라 적절한 스토리지 클래스를 선택하여 비용을 최적화해야 합니다. 자주 액세스하지 않는 데이터를 S3 Standard에 계속 두면 불필요한 비용이 발생할 수 있습니다.
    • 데이터 전송 비용 (Data Transfer Out): S3에서 외부로 데이터를 전송(다운로드)할 때는 비용이 발생합니다. 애플리케이션 아키텍처를 설계할 때 이 점을 고려해야 합니다. 동일 리전 내의 다른 AWS 서비스로의 전송은 일반적으로 무료이거나 저렴합니다.
    • 요청 수: 객체에 대한 PUT, GET 등의 요청(request)에도 비용이 발생합니다. 매우 빈번한 요청이 발생하는 시나리오에서는 이 비용도 고려해야 합니다.
    • 수명 주기 정책(Lifecycle Policy): 사용하지 않는 객체를 삭제하거나, 시간이 지남에 따라 더 저렴한 스토리지 클래스로 자동으로 이동시키도록 수명 주기 정책을 설정하여 비용을 절감할 수 있습니다.
  3. 데이터 관리 및 거버넌스
    • 버전 관리 (Versioning): 실수로 인한 데이터 삭제나 덮어쓰기 위험을 줄이기 위해 중요한 버킷에는 버전 관리를 활성화하는 것이 좋습니다. 다만, 모든 버전이 저장되므로 스토리지 비용이 증가할 수 있습니다.
    • 객체 명명 규칙: 객체 키(Object Key)는 파일 경로와 유사하게 작동합니다. 효율적인 검색 및 관리를 위해 논리적인 명명 규칙을 따르는 것이 좋습니다.
    • 태깅 (Tagging): 버킷과 객체에 태그를 지정하여 비용 할당, 보안 정책 적용, 검색 등을 효율적으로 관리할 수 있습니다.
    • 로깅 및 모니터링: S3 액세스 로그(Access Logs)를 활성화하여 누가 언제 어떤 객체에 접근했는지 기록하고, CloudWatch 및 AWS Config를 통해 버킷 구성을 모니터링하여 잠재적인 보안 위험이나 잘못된 설정을 감지해야 합니다.
  4. 성능 최적화
    • 리전 선택: 사용자 또는 애플리케이션과 가장 가까운 리전에 버킷을 생성하여 지연 시간을 줄입니다.
    • 접두사(Prefix) 설계: 특정 접두사(폴더 구조)에 대한 동시 요청이 많을 경우 성능 병목 현상이 발생할 수 있으므로, 키 명명을 분산하여 성능을 최적화하는 것이 중요합니다.
    • 멀티파트 업로드 (Multipart Upload): 대용량 파일을 업로드할 때는 멀티파트 업로드를 사용하여 성능을 향상시킬 수 있습니다.

 

이러한 사용 사례와 주의할 점을 고려하여 S3를 효과적이고 안전하게 활용할 수 있습니다.

https://docs.aws.amazon.com/iam/

 

AWS IAM(Identity and Access Management)은 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스입니다. 즉, "누가(사용자), 무엇을(AWS 서비스 및 리소스), 어떻게(권한)" 할 수 있는지를 관리하고 제어하는 역할을 합니다. AWS 클라우드 환경의 보안을 위한 핵심 서비스이며, 추가 비용 없이 사용할 수 있습니다.

 

IAM의 핵심 개념 및 구성 요소

IAM은 다음의 주요 구성 요소들을 통해 접근 제어 기능을 제공합니다.

  1. IAM 사용자 (IAM User):
    • AWS 계정 내에서 AWS 리소스와 상호 작용할 수 있는 권한이 있는 개별 사용자 또는 **애플리케이션(기계)**을 나타내는 엔티티입니다.
    • 각 IAM 사용자에게는 AWS Management Console에 로그인하기 위한 비밀번호와 AWS CLI 또는 SDK를 통해 프로그래밍 방식으로 AWS에 접근하기 위한 액세스 키(액세스 키 ID 및 비밀 액세스 키)를 발급할 수 있습니다.
    • 보안 모범 사례에 따라 루트(Root) 계정 대신 IAM 사용자를 생성하여 사용하는 것이 강력히 권장됩니다.
  2. IAM 그룹 (IAM Group):
    • 여러 IAM 사용자를 한데 묶어 놓은 컬렉션입니다.
    • 그룹에 권한 정책을 연결하면 해당 그룹에 속한 모든 사용자에게 동일한 권한이 일괄적으로 적용됩니다. 이는 여러 사용자에게 동일한 권한을 부여할 때 개별 사용자마다 정책을 연결하는 번거로움을 줄여 관리 효율성을 높여줍니다.
    • 예를 들어, "개발자" 그룹에는 EC2 인스턴스 생성 및 관리 권한을 부여하고, "운영" 그룹에는 특정 S3 버킷에 대한 읽기/쓰기 권한을 부여할 수 있습니다.
  3. IAM 역할 (IAM Role):
    • IAM 사용자와 달리, 특정 사용자나 그룹에 영구적으로 연결되지 않는 임시 보안 자격 증명입니다.
    • 주로 AWS 서비스(예: EC2 인스턴스, Lambda 함수)가 다른 AWS 서비스에 접근해야 할 때, 또는 다른 AWS 계정이나 외부 시스템(예: 온프레미스 디렉토리 서비스와 연동된 사용자)이 AWS 리소스에 접근해야 할 때 사용됩니다.
    • 역할을 사용하면 액세스 키를 공유하거나 관리할 필요 없이 필요한 권한을 일시적으로 부여할 수 있어 보안성이 향상됩니다.
    • 역할은 "누가 이 역할을 맡을 수 있는지"를 정의하는 **신뢰 정책(Trust Policy)**과 "이 역할을 맡으면 어떤 작업을 할 수 있는지"를 정의하는 **권한 정책(Permissions Policy)**으로 구성됩니다.
  4. IAM 정책 (IAM Policy):
    • AWS 리소스에 대한 권한을 JSON 형식으로 정의한 문서입니다.
    • 정책은 "무엇을 허용(Allow)하거나 거부(Deny)할 것인가"를 명시합니다.
    • 주요 구성 요소는 다음과 같습니다:
      • Effect: Allow(허용) 또는 Deny(거부)
      • Action: 허용 또는 거부할 AWS 서비스 작업 (예: s3:GetObject, ec2:RunInstances)
      • Resource: 작업이 적용될 AWS 리소스 (예: 특정 S3 버킷, 특정 EC2 인스턴스)
      • Condition: 특정 조건을 충족할 때만 권한을 부여 (예: 특정 IP 주소에서만 접근 허용, 특정 시간대에만 허용)
    • 정책 유형:
      • 자격 증명 기반 정책 (Identity-based Policy): IAM 사용자, 그룹, 역할에 직접 연결되는 정책입니다.
      • 리소스 기반 정책 (Resource-based Policy): 특정 리소스(예: S3 버킷, SQS 큐)에 연결되어 해당 리소스에 누가, 어떤 조건으로 접근할 수 있는지를 정의합니다.
      • 관리형 정책 (Managed Policy): AWS가 미리 정의해 놓은 정책(AWS 관리형 정책) 또는 사용자가 직접 생성하여 여러 IAM 엔티티에 재사용할 수 있는 정책(고객 관리형 정책)입니다.
      • 인라인 정책 (Inline Policy): 특정 IAM 사용자, 그룹 또는 역할에 직접 생성하고 연결되는 정책입니다. 해당 엔티티가 삭제되면 정책도 함께 삭제됩니다.

 

IAM이 제공하는 주요 기능

  • 중앙 집중식 액세스 제어: AWS 계정 내의 모든 리소스에 대한 접근을 한 곳에서 관리합니다.
  • 세분화된 권한 부여: 사용자, 그룹, 역할에 따라 AWS 서비스 및 리소스에 대한 매우 세밀한 권한을 부여할 수 있습니다. 예를 들어, 특정 S3 버킷의 특정 폴더에만 읽기 권한을 부여할 수 있습니다.
  • 최소 권한 원칙 (Least Privilege): 필요한 최소한의 권한만을 부여하여 보안 위험을 최소화합니다. 이는 보안의 핵심 원칙입니다.
  • 멀티 팩터 인증 (MFA): 사용자 로그인 시 비밀번호 외에 추가적인 인증 단계를 요구하여 보안을 강화합니다.
  • 임시 보안 자격 증명: IAM 역할을 통해 임시 자격 증명을 사용하여 장기 액세스 키를 관리할 필요 없이 보안을 강화합니다.
  • 자격 증명 연동 (Identity Federation): 온프레미스 디렉토리(예: Active Directory)의 사용자나 SAML/OpenID Connect 기반의 외부 자격 증명 시스템을 AWS와 연동하여 기존 자격 증명으로 AWS에 로그인하고 리소스에 접근할 수 있게 합니다.
  • 액세스 키 관리: 사용자와 애플리케이션을 위한 액세스 키를 생성, 순환, 비활성화, 삭제할 수 있습니다.
  • 액세스 분석: AWS 리소스에 대한 액세스 경로를 분석하고, 사용자들이 실제로 어떤 권한을 사용했는지 모니터링하여 불필요한 권한을 제거할 수 있도록 돕습니다.

 

IAM은 AWS 클라우드를 안전하게 운영하기 위한 필수 서비스이며, 올바른 IAM 설정을 통해 보안 사고를 예방하고 규정 준수를 달성할 수 있습니다.

https://docs.aws.amazon.com/vpc/

 

AWS VPC(Virtual Private Cloud)는 AWS 클라우드 내에서 사용자가 논리적으로 격리된 자신만의 가상 네트워크를 정의하고 생성할 수 있게 해주는 서비스입니다. 쉽게 말해, AWS의 거대한 클라우드 데이터센터 안에 마치 나만의 독립적인 데이터센터를 구축하는 것과 같다고 볼 수 있습니다.

 

VPC의 주요 구성 요소

VPC는 단순히 네트워크를 격리하는 것을 넘어, 다음과 같은 다양한 구성 요소들을 포함하여 완벽한 네트워크 환경을 구축할 수 있게 합니다.

  • IP 주소 범위 (CIDR 블록): VPC에 할당할 프라이빗 IP 주소 범위(예: 10.0.0.0/16)를 지정합니다. 이 범위 내에서만 인스턴스 등의 리소스가 IP를 할당받을 수 있습니다.
  • 서브넷 (Subnet): VPC를 더 작은 논리적 단위로 나눈 것입니다. 서브넷은 특정 가용 영역(AZ) 내에 존재하며, 퍼블릭 서브넷(인터넷 접속 가능)과 프라이빗 서브넷(인터넷 접속 불가)으로 구분하여 리소스를 배치할 수 있습니다.
  • 라우팅 테이블 (Route Table): 서브넷 내의 트래픽이 어디로 향해야 하는지(예: 인터넷 게이트웨이, 다른 서브넷, VPN 등)를 결정하는 규칙(라우트) 집합입니다.
  • 인터넷 게이트웨이 (Internet Gateway, IGW): VPC 내의 리소스가 인터넷과 통신할 수 있도록 해주는 VPC 구성 요소입니다. 퍼블릭 서브넷에 연결되어 외부 트래픽을 허용합니다.
  • NAT 게이트웨이 (NAT Gateway) 또는 NAT 인스턴스: 프라이빗 서브넷에 있는 리소스가 인터넷으로 나가는 아웃바운드 트래픽만 허용하고, 외부에서 직접 프라이빗 서브넷으로 인바운드 트래픽이 들어오는 것을 차단합니다. 이는 보안을 강화하는 데 중요합니다.
  • 보안 그룹 (Security Group): EC2 인스턴스 레벨에서 작동하는 가상 방화벽입니다. 특정 인스턴스에 대한 인바운드/아웃바운드 트래픽 규칙을 설정하여 어떤 포트를 어떤 IP에서 허용할지 세밀하게 제어합니다.
  • 네트워크 ACL (Network Access Control List, NACL): 서브넷 레벨에서 작동하는 방화벽입니다. 보안 그룹보다 더 광범위하게 서브넷의 모든 트래픽을 허용하거나 거부하는 규칙을 설정합니다. (Stateful인 보안 그룹과 달리 Stateless)
  • VPC 피어링 (VPC Peering): 두 개의 독립적인 VPC 간에 직접적인 네트워크 연결을 설정하여 마치 하나의 네트워크인 것처럼 통신할 수 있게 합니다.

 

VPC가 중요한 이유

VPC는 AWS 클라우드에서 안정적이고 안전하며 확장 가능한 아키텍처를 구축하는 데 있어 핵심적인 기반이 됩니다. 그 중요성은 다음과 같습니다.

  1. 강력한 보안 및 격리:
    • 논리적 격리: VPC는 사용자의 AWS 계정 전용 가상 네트워크이므로, 다른 AWS 고객의 네트워크와 완전히 분리되어 데이터 및 애플리케이션의 보안을 보장합니다.
    • 세분화된 제어: 서브넷, 보안 그룹, NACL을 통해 인스턴스 및 서브넷 수준에서 트래픽 흐름을 정교하게 제어할 수 있습니다. 예를 들어, 데이터베이스는 외부에서 접근할 수 없는 프라이빗 서브넷에 배치하고, 웹 서버는 퍼블릭 서브넷에 배치하여 필요한 포트만 개방하는 등의 설정이 가능합니다.
    • 내부망/외부망 분리: 프라이빗 서브넷과 퍼블릭 서브넷을 구성하여 민감한 데이터를 처리하는 리소스(데이터베이스, 내부 애플리케이션 서버)는 외부 인터넷으로부터 보호하고, 웹 서버와 같이 외부와 통신해야 하는 리소스는 안전하게 노출할 수 있습니다.
  2. 네트워크 아키텍처의 유연성과 사용자 정의:
    • IP 주소 범위 사용자 정의: 조직의 기존 온프레미스 네트워크와 충돌하지 않도록 사용자 정의 IP 주소 범위를 선택할 수 있습니다.
    • 서브넷 구성: 애플리케이션의 계층(웹 계층, 애플리케이션 계층, 데이터베이스 계층)에 따라 서브넷을 분할하고, 각 계층 간의 네트워크 규칙을 정의하여 보안 및 관리 효율성을 높일 수 있습니다.
    • 네트워크 토폴로지 설계: 인터넷 게이트웨이, NAT 게이트웨이, VPN, Direct Connect 등을 사용하여 다양한 네트워크 연결 옵션을 구성하고, 온프레미스 데이터센터와 클라우드 환경을 연결하는 하이브리드 클라우드 아키텍처를 구현할 수 있습니다.
  3. 고가용성 및 재해 복구:
    • 다중 AZ 배포: 각 서브넷은 특정 가용 영역에 속하므로, 여러 가용 영역에 걸쳐 서브넷을 생성하고 리소스를 분산 배치하여 한 AZ에 장애가 발생하더라도 서비스의 연속성을 유지할 수 있도록 합니다.
  4. 규정 준수 (Compliance):
    • 많은 산업 및 국가별 규정(예: 금융, 의료)은 데이터의 격리, 접근 제어, 네트워크 보안 등에 대한 엄격한 요구 사항을 가지고 있습니다. VPC는 이러한 규정 준수를 충족하는 데 필요한 강력한 네트워크 환경을 제공합니다.
  5. 비용 효율성:
    • 온프레미스에서 물리적인 네트워크 장비(라우터, 스위치, 방화벽)를 구매하고 유지 관리하는 대신, VPC를 통해 필요한 네트워크 인프라를 클라우드에서 유연하게 프로비저닝하고 사용한 만큼만 지불함으로써 비용을 절감할 수 있습니다.

 

요약하자면, AWS VPC는 단순한 네트워크 연결을 넘어, 클라우드 환경에서 사용자에게 완벽하게 제어되고, 안전하며, 유연한 맞춤형 네트워크 환경을 제공하는 핵심 서비스이며, 현대적인 클라우드 아키텍처의 기반이 됩니다.

https://docs.aws.amazon.com/ec2/

 

AWS EC2(Elastic Compute Cloud) 인스턴스는 AWS 클라우드에서 제공하는 가상 서버를 의미합니다. 마치 개인 컴퓨터를 사용하는 것처럼, 클라우드 환경에서 운영 체제를 설치하고 원하는 소프트웨어를 실행하여 다양한 작업을 수행할 수 있습니다.

 

"Elastic"이라는 이름이 붙은 이유는 컴퓨팅 요구 사항에 따라 서버의 용량(CPU, 메모리 등)을 탄력적으로 확장하거나 축소할 수 있기 때문입니다.

 

EC2 인스턴스의 주요 특징 및 장점:

  • 탄력적 확장성: 비즈니스 요구 사항이나 트래픽 변화에 따라 몇 분 안에 서버 용량을 늘리거나 줄일 수 있습니다. 예를 들어, 웹사이트 트래픽이 갑자기 증가하면 인스턴스를 추가하거나 기존 인스턴스의 사양을 높일 수 있고, 트래픽이 줄어들면 다시 축소하여 비용을 절감할 수 있습니다.
  • 다양한 인스턴스 유형: CPU, 메모리, 스토리지, 네트워킹 용량이 다양한 수많은 인스턴스 유형이 제공됩니다. 범용, 컴퓨팅 최적화, 메모리 최적화, 스토리지 최적화, 가속화된 컴퓨팅 등 워크로드의 특성에 따라 최적화된 인스턴스를 선택할 수 있습니다.
  • 다양한 운영 체제 지원: Linux, Windows, macOS 등 다양한 운영 체제를 선택하여 인스턴스를 생성할 수 있습니다.
  • 종량제 요금: 사용한 만큼만 요금을 지불하는 종량제 모델을 따르므로, 초기 하드웨어 투자 없이 유연하게 비용을 관리할 수 있습니다.
  • AMI (Amazon Machine Image): 사전 구성된 운영 체제, 애플리케이션 서버, 애플리케이션 등을 포함하는 템플릿입니다. AMI를 사용하여 새로운 인스턴스를 빠르게 생성하거나, 자신만의 AMI를 만들어 일관된 환경을 배포할 수 있습니다.
  • 높은 가용성: 여러 가용 영역(Availability Zone)에 인스턴스를 배포하여 장애 발생 시에도 서비스의 연속성을 유지할 수 있습니다.

EC2 인스턴스 사용 방법:

EC2 인스턴스를 사용하는 일반적인 단계는 다음과 같습니다.

  1. AWS 계정 생성 및 로그인: AWS 서비스를 이용하기 위한 계정을 생성하고 AWS Management Console에 로그인합니다. AWS 프리 티어를 통해 특정 인스턴스 유형을 무료로 사용할 수 있습니다.
  2. 리전 선택: 애플리케이션 사용자와 가까운 리전을 선택하여 지연 시간을 줄이고 데이터 주권 요구 사항을 충족합니다.
  3. EC2 서비스로 이동: AWS Management Console에서 "EC2"를 검색하여 EC2 대시보드로 이동합니다.
  4. 인스턴스 시작 (Launch Instance):
    • 이름 지정: 인스턴스를 식별할 수 있는 이름을 지정합니다.
    • AMI 선택: 사용할 운영 체제(예: Amazon Linux, Ubuntu, Windows Server 등)가 포함된 AMI를 선택합니다. AWS Marketplace에서 특정 소프트웨어가 미리 설치된 AMI를 선택할 수도 있습니다.
    • 인스턴스 유형 선택: 워크로드의 CPU, 메모리, 스토리지 요구 사항에 맞춰 적절한 인스턴스 유형(예: t2.micro, m5.large 등)을 선택합니다.
    • 키 페어 생성 또는 선택: 인스턴스에 안전하게 접속하기 위한 키 페어(SSH 키)를 생성하거나 기존 키 페어를 선택합니다. 이 키 페어의 프라이빗 키(.pem 파일)는 인스턴스에 접속할 때 필요하므로 안전하게 보관해야 합니다.
    • 네트워크 설정:
      • VPC(Virtual Private Cloud): 인스턴스가 배포될 가상 네트워크를 선택합니다.
      • 서브넷: VPC 내의 특정 서브넷을 선택합니다.
      • 보안 그룹 (Security Group): 인스턴스로 들어오고 나가는 네트워크 트래픽을 제어하는 가상 방화벽 규칙을 설정합니다. 예를 들어, 웹 서버라면 HTTP(80), HTTPS(443) 포트를 열어주고, SSH/RDP 접속을 위해 22번(Linux) 또는 3389번(Windows) 포트를 특정 IP에서만 허용하도록 설정합니다.
      • 퍼블릭 IP 자동 할당: 외부에서 인스턴스에 접속하려면 퍼블릭 IP가 필요합니다. 기본적으로 활성화되어 있습니다.
    • 스토리지 설정: 인스턴스에 연결될 스토리지(EBS 볼륨)의 종류, 크기, 암호화 여부 등을 설정합니다.
  5. 인스턴스 시작: 모든 설정을 검토한 후 "인스턴스 시작" 버튼을 클릭하여 인스턴스를 생성합니다.
  6. 인스턴스 연결:
    • Linux 인스턴스: SSH 클라이언트(터미널)를 사용하여 .pem 키 파일을 지정하고 인스턴스의 퍼블릭 IP 또는 DNS를 통해 접속합니다. (ssh -i /path/to/your-key.pem ec2-user@your-instance-public-ip)
    • Windows 인스턴스: RDP(원격 데스크톱 프로토콜) 클라이언트를 사용하여 접속하며, AWS 콘솔에서 비밀번호를 검색하여 사용합니다.
    • EC2 Instance Connect: AWS 콘솔에서 직접 브라우저 기반으로 인스턴스에 접속할 수 있는 편리한 방법도 제공됩니다.
  7. 인스턴스 사용 및 관리:
    • 인스턴스에 접속하여 필요한 소프트웨어를 설치하고, 애플리케이션을 배포하며, 데이터를 저장합니다.
    • 모니터링 도구를 사용하여 인스턴스의 성능을 확인하고, 필요에 따라 인스턴스 유형을 변경하거나 스토리지를 확장합니다.
    • 더 이상 필요 없는 인스턴스는 종료(Terminate)하여 불필요한 비용이 발생하지 않도록 합니다. (중지(Stop)는 인스턴스를 일시적으로 멈추는 것이며, 스토리지 비용은 계속 발생할 수 있습니다.)

 

EC2 인스턴스는 웹 서버, 애플리케이션 서버, 데이터베이스 서버, 개발/테스트 환경, 배치 처리, 빅 데이터 분석 등 거의 모든 종류의 컴퓨팅 워크로드에 활용될 수 있습니다.

https://docs.aws.amazon.com/whitepapers/latest/aws-overview/global-infrastructure.html

 

AWS의 글로벌 인프라는 전 세계에 걸쳐 안정적이고 확장 가능한 클라우드 서비스를 제공하기 위해 설계되었으며, 주로 다음과 같은 구성 요소들로 이루어져 있습니다:

 

  1. 리전 (Region):
    • AWS 서비스가 제공되는 물리적인 지리적 위치입니다. 전 세계의 특정 국가나 도시에 위치하며, 각 리전은 완전히 독립적으로 운영됩니다.
    • 사용자는 애플리케이션의 지연 시간 최소화, 데이터 주권 및 규정 준수 (예: 특정 국가 내 데이터 저장 의무) 등을 고려하여 리전을 선택합니다.
    • 각 리전은 여러 개의 가용 영역(AZ)으로 구성됩니다.
  2. 가용 영역 (Availability Zone, AZ):
    • 리전 내에서 물리적으로 격리된 하나 이상의 데이터 센터 모음입니다.
    • 각 AZ는 자체적인 전력, 냉각, 네트워킹 및 물리적 시설을 갖추고 있어 한 AZ에 문제가 발생하더라도 다른 AZ에 영향을 미치지 않도록 설계되었습니다.
    • AZ 간에는 고속, 저지연 광섬유 네트워크로 연결되어 있어 데이터 복제 및 고가용성 아키텍처 구축이 용이합니다.
    • 일반적으로 각 리전은 최소 2개 이상의 가용 영역을 포함합니다.
  3. 엣지 로케이션 (Edge Location):
    • 사용자와 가장 가까운 곳에 위치하여 콘텐츠 전송 네트워크(CDN) 서비스인 Amazon CloudFront와 같은 서비스를 통해 캐싱된 콘텐츠를 사용자에게 빠르게 전달하는 데 사용됩니다.
    • 전 세계적으로 수백 개의 엣지 로케이션이 분포되어 있어 최종 사용자에게 콘텐츠를 더 낮은 지연 시간으로 제공할 수 있습니다.
  4. 리전 엣지 캐시 (Regional Edge Cache):
    • 엣지 로케이션과 오리진 서버 (예: S3 버킷, EC2 인스턴스) 사이에 위치하는 더 큰 캐싱 계층입니다.
    • 엣지 로케이션에 없는 콘텐츠를 요청할 경우, 오리진 서버로 바로 가는 대신 리전 엣지 캐시에서 먼저 확인하여 지연 시간을 줄입니다.
    • 덜 자주 액세스되는 콘텐츠를 효율적으로 캐싱하고 전송하는 역할을 합니다.
  5. 로컬 영역 (Local Zones):
    • 주요 대도시 지역에 AWS 인프라를 확장하여, 낮은 지연 시간이 매우 중요한 특정 애플리케이션 (예: 실시간 게임, 미디어 및 엔터테인먼트 콘텐츠 생성)에 더 가까운 컴퓨팅 및 스토리지 서비스를 제공합니다.
    • 기존 AWS 리전의 기능을 확장하여 지리적으로 더 가까운 곳에서 서비스를 제공합니다.
  6. Wavelength Zones:
    • 5G 네트워크의 엣지에서 애플리케이션을 배포하여 매우 낮은 지연 시간을 요구하는 모바일 엣지 컴퓨팅 사용 사례를 지원합니다.
    • 통신 사업자의 5G 네트워크 내에 AWS 컴퓨팅 및 스토리지 서비스를 내장합니다.
  7. AWS Outposts:
    • 고객의 온프레미스 데이터 센터에 AWS 인프라, 서비스 및 운영 모델을 확장하여 제공하는 완전 관리형 서비스입니다.
    • 온프레미스 환경에서 AWS 서비스를 사용하고 싶지만 클라우드로 완전히 이전하기 어려운 특정 요구 사항이 있는 기업에 유용합니다.

 

이러한 구성 요소들이 유기적으로 연결되어 AWS는 전 세계 사용자들에게 높은 가용성, 확장성, 성능, 보안 및 유연성을 갖춘 클라우드 서비스를 제공합니다.

https://www.typescriptlang.org/ko/docs/handbook/declaration-files/dts-from-js.html

 

.d.ts 타입 정의 파일이란?

.d.ts 파일은 "Declaration File"의 약자로, JavaScript 코드의 타입 정보를 정의하는 파일입니다.

 

TypeScript는 JavaScript 코드 자체는 이해하지 못하지만, 이 .d.ts 파일을 통해 JavaScript 코드의 구조(함수, 클래스, 변수 등)와 각 요소의 타입을 파악합니다.

 

왜 필요한가요?

  1. 기존 JavaScript 라이브러리 사용: 대부분의 JavaScript 라이브러리(jQuery, React, Vue 등)는 순수 JavaScript로 작성되어 있습니다. TypeScript 프로젝트에서 이러한 라이브러리를 사용할 때, TypeScript 컴파일러는 해당 라이브러리의 코드에 대한 타입 정보를 알 수 없습니다. .d.ts 파일은 이러한 JavaScript 라이브러리에 대한 "타입 설명서" 역할을 하여, TypeScript가 해당 라이브러리의 함수 호출, 객체 속성 등에 대해 타입 검사를 수행하고 자동 완성을 제공할 수 있도록 합니다.
  2. 타입 추론의 한계 극복: TypeScript는 어느 정도 타입 추론을 제공하지만, 모든 경우에 정확한 타입을 추론할 수는 없습니다. 특히 복잡한 JavaScript 코드나 동적으로 생성되는 코드의 경우, .d.ts 파일을 통해 명시적으로 타입을 정의함으로써 정확한 타입 검사와 IntelliSense를 얻을 수 있습니다.
  3. 타입 분리: .d.ts 파일은 실제 구현 로직을 포함하지 않고 오직 타입 정보만 정의합니다. 이는 타입과 구현을 분리하여 코드의 가독성을 높이고, 대규모 프로젝트에서 모듈 간의 의존성을 명확히 하는 데 도움이 됩니다.

 

어떻게 만들 수 있나요?

.d.ts 파일을 만드는 방법은 크게 세 가지가 있습니다.

 

1. 수동으로 작성하기 (Manual Creation)

  • 가장 기본적인 방법으로, JavaScript 코드의 구조를 파악하고 그에 맞는 타입 정의를 직접 작성하는 것입니다.
  • 예를 들어, 다음과 같은 my-library.js 파일이 있다고 가정해 봅시다.
// my-library.js
function greet(name) {
  return "Hello, " + name + "!";
}

const myNumber = 123;

class MyClass {
  constructor(value) {
    this.value = value;
  }
  getValue() {
    return this.value;
  }
}

module.exports = {
  greet,
  myNumber,
  MyClass,
};
  • 이에 대한 .d.ts 파일 (my-library.d.ts)은 다음과 같이 작성할 수 있습니다.
// my-library.d.ts
declare function greet(name: string): string;
declare const myNumber: number;

declare class MyClass {
  constructor(value: any); // 또는 구체적인 타입 (예: string, number)
  getValue(): any; // 또는 구체적인 타입
}

declare module "my-library" {
  export { greet, myNumber, MyClass };
}
  • declare 키워드는 "여기에 정의된 것은 실제 구현이 아니라 타입 정보일 뿐이며, 런타임에는 존재한다"는 것을 TypeScript에 알려줍니다.
  • declare module은 Node.js의 require나 ES6 import와 같이 모듈로 내보내는 경우에 사용됩니다.

 

2. TypeScript 컴파일러를 사용하여 자동 생성하기

  • TypeScript 프로젝트를 컴파일할 때, tsconfig.json 파일에 declaration: true 옵션을 설정하면 컴파일러가 .js 파일과 함께 해당 .ts 파일에 대한 .d.ts 파일을 자동으로 생성해줍니다.
  • 이는 .ts 파일을 기반으로 .d.ts 파일을 만들 때 유용합니다. 특히 NPM 패키지로 배포할 라이브러리를 TypeScript로 작성하는 경우, 이 옵션을 통해 타입 정의 파일을 제공할 수 있습니다.
// tsconfig.json
{
  "compilerOptions": {
    "outDir": "./dist",
    "declaration": true, // 이 옵션이 중요합니다.
    "module": "commonjs",
    "target": "es5"
  },
  "include": ["src/**/*.ts"]
}

 

  • 이렇게 설정하면 src/index.ts 파일이 dist/index.js로 컴파일될 때 dist/index.d.ts 파일도 함께 생성됩니다.

 

3. DefinitelyTyped 사용하기

  • 대부분의 유명한 JavaScript 라이브러리(React, Lodash, Express 등)는 이미 DefinitelyTyped라는 커뮤니티 주도의 오픈 소스 프로젝트에서 .d.ts 파일이 제공됩니다.
  • DefinitelyTyped는 수많은 JavaScript 라이브러리에 대한 고품질의 타입 정의를 모아놓은 저장소입니다.
  • npm을 통해 @types/ 접두사와 함께 해당 라이브러리의 타입 정의 패키지를 설치할 수 있습니다.
npm install --save-dev @types/react
npm install --save-dev @types/lodash
  • 이렇게 설치하면 TypeScript는 자동으로 node_modules/@types 디렉토리에서 필요한 .d.ts 파일을 찾아 사용합니다. 이것이 대부분의 경우 JavaScript 라이브러리용 .d.ts 파일을 얻는 가장 일반적이고 권장되는 방법입니다.

 

.d.ts 파일은 TypeScript 생태계에서 매우 중요한 역할을 하며, JavaScript 코드와의 상호 운용성을 가능하게 하고 TypeScript의 강력한 타입 검사 및 개발 생산성 향상 기능을 기존 JavaScript 자산에도 적용할 수 있도록 해줍니다.

 

타입스크립트 공식문서

 

TypeScript의 동작 원리

TypeScript는 Microsoft에서 개발한 오픈 소스 프로그래밍 언어로, JavaScript에 정적 타입(Static Type)을 추가한 언어입니다. TypeScript 코드는 브라우저나 Node.js 환경에서 직접 실행될 수 없으며, JavaScript로 트랜스파일(Transpile)되어야 합니다. 이것이 TypeScript의 핵심 동작 원리입니다.

 

다음은 TypeScript의 주요 동작 원리입니다.

  1. 정적 타입 검사 (Static Type Checking):
    • TypeScript의 가장 큰 특징은 컴파일 시점에 타입을 검사한다는 것입니다. 개발자가 변수, 함수 매개변수, 반환 값 등에 타입을 명시하면, TypeScript 컴파일러(TSC)는 코드가 실행되기 전에 이 타입들이 올바르게 사용되었는지 확인합니다.
    • 이는 런타임에 발생할 수 있는 잠재적인 오류(예: undefined에 접근하거나, 잘못된 타입의 데이터를 전달하는 등)를 미리 방지하여 개발 과정에서 버그를 줄이고 코드의 안정성을 높입니다.
    • 예를 들어, 숫자 타입을 기대하는 함수에 문자열을 전달하면 컴파일 시점에 오류를 발생시킵니다.
  2. 컴파일 또는 트랜스파일 (Compile/Transpile):
    • 작성된 TypeScript 코드(.ts 또는 .tsx 파일)는 TypeScript 컴파일러(TSC)에 의해 일반 JavaScript 코드(.js 파일)로 변환됩니다. 이 과정을 "트랜스파일(Transpile)"이라고 부릅니다.
    • 트랜스파일된 JavaScript 코드는 브라우저, Node.js, 또는 JavaScript를 실행할 수 있는 어떤 환경에서도 실행될 수 있습니다.
    • 이 과정에서 TypeScript의 타입 정보는 모두 제거됩니다. JavaScript는 런타임에 타입을 검사하는 동적 타입 언어이기 때문에, TypeScript의 타입 정보는 오직 개발 단계와 컴파일 시점에만 유효합니다.
  3. 향상된 개발 경험 (Enhanced Developer Experience):
    • 코드 자동 완성 및 IntelliSense: 타입 정보 덕분에 IDE(통합 개발 환경)나 코드 에디터(VS Code 등)는 코드 자동 완성, 매개변수 힌트, 객체 속성 제안 등을 훨씬 더 정확하게 제공할 수 있습니다. 이는 개발 생산성을 크게 향상시킵니다.
    • 리팩토링 용이성: 타입 시스템은 코드의 구조를 명확하게 정의하므로, 대규모 애플리케이션에서 코드를 리팩토링할 때 훨씬 안전하고 효율적으로 작업할 수 있습니다.
    • 오류 조기 발견: 런타임이 아닌 개발 및 컴파일 시점에 오류를 발견할 수 있어 디버깅 시간을 단축하고 개발 비용을 절감합니다.
  4. JavaScript와의 호환성 (Compatibility with JavaScript):
    • TypeScript는 JavaScript의 상위 집합(Superset)입니다. 즉, 유효한 모든 JavaScript 코드는 유효한 TypeScript 코드이기도 합니다.
    • 이는 기존 JavaScript 프로젝트에 TypeScript를 점진적으로 도입하기 쉽게 만듭니다. 새로운 코드를 TypeScript로 작성하고, 기존 JavaScript 코드는 그대로 유지하거나 점진적으로 마이그레이션할 수 있습니다.

 

요약하자면, TypeScript는 개발 시점에 강력한 타입 검사를 통해 코드의 안정성과 가독성을 높이고, 궁극적으로는 브라우저나 Node.js 환경에서 실행 가능한 순수 JavaScript로 변환되는 과정을 거칩니다.

 

HTTP 통신에서 클라이언트와 서버 간의 인증 정보를 주고받는 방식은 다양하며, 특히 Cookie 헤더와 Authorization 헤더는 각각 다른 목적과 보안 특성을 가집니다. 이를 이해하는 것은 JWT(JSON Web Token) 기반 인증 시스템을 안전하고 효율적으로 구축하는 데 중요합니다.


1. Cookie 헤더와 Authorization 헤더의 근본적인 차이

특징/영역 Cookie 헤더 Authorization 헤더
주요 목적 세션 관리, 상태 유지, 사용자 식별 사용자 인증 및 권한 부여, 자격 증명 전달
전송 방식 브라우저에 의해 자동 전송 (설정된 도메인/경로에 따라) 클라이언트 코드(JavaScript)에서 명시적으로 삽입하여 전송
예시 내용 세션 ID, 리프레시 토큰 액세스 토큰 (Bearer Token 형태)
장점 - 편리한 세션 관리<br>- HttpOnly로 XSS 방어 가능 - 무상태(stateless) API에 적합<br>- CSRF 방어에 유리 (자동 전송 안 됨)
단점 - CSRF 공격에 취약 (자동 전송됨)<br>- 크기 제한 - 클라이언트에서 토큰 관리가 필요<br>- XSS에 취약 (localStorage 등 저장 시)

2. JWT 기반 인증에서 두 헤더의 전략적 활용 (보안 강화)

액세스 토큰과 리프레시 토큰은 각각의 역할과 보안 요구사항이 다르므로, 이들을 별도의 방식으로 관리하여 보안과 사용성 사이의 균형을 맞춥니다.

  • 리프레시 토큰을 HttpOnly 쿠키에 담는 이유:
    • 강력한 XSS(Cross-Site Scripting) 방어: 리프레시 토큰은 수명이 길어 탈취 시 위험이 큽니다. HttpOnly 속성은 JavaScript가 쿠키에 접근하는 것을 원천적으로 차단하므로, 악성 스크립트가 리프레시 토큰을 읽거나 탈취하는 것을 막아줍니다.
    • 클라이언트의 직접 접근 불필요: 리프레시 토큰은 주로 액세스 토큰 갱신 시에만 사용되며, 브라우저가 해당 갱신 엔드포인트로 요청을 보낼 때 HttpOnly 쿠키에 담긴 토큰을 자동으로 포함시켜주면 되므로 JavaScript의 직접적인 접근이 필요 없습니다.
  • 액세스 토큰을 Authorization 헤더에 담는 이유:
    • API 요청의 표준: 대부분의 RESTful API는 Authorization: Bearer {액세스 토큰} 형태로 인증 정보를 받습니다. 이는 API 요청의 명확성과 표준성을 유지하는 데 도움이 됩니다.
    • 클라이언트(JavaScript)의 유연한 접근: 프론트엔드 JavaScript가 API 요청을 보낼 때 동적으로 액세스 토큰을 Authorization 헤더에 삽입해야 합니다. HttpOnly 쿠키는 JS 접근을 막으므로, 액세스 토큰은 메모리나 (XSS 방어에 유의하며) localStorage 등에 저장하는 것이 일반적입니다.
    • CSRF(Cross-Site Request Forgery) 방어 효과: 브라우저는 Authorization 헤더를 자동으로 요청에 추가하지 않습니다. 따라서 악성 사이트가 사용자를 속여 요청을 보내더라도, 유효한 액세스 토큰이 헤더에 포함되지 않아 서버가 해당 요청을 인증되지 않은 것으로 간주하게 됩니다. 이는 CSRF 공격에 대한 중요한 방어선이 됩니다.

3. SameSite 쿠키 속성을 통한 CSRF 공격 방어

SameSite 속성은 브라우저가 크로스 사이트 요청에서 쿠키를 언제 전송할지 제어함으로써 CSRF 공격을 완화하는 데 기여합니다.

  • SameSite=Strict: 가장 엄격. 동일한 사이트 요청에만 쿠키 전송. 외부 링크를 통한 접근 시에도 쿠키가 전송되지 않아 CSRF 방어에 매우 강력하지만, 사용자 경험을 저해할 수 있습니다.
  • SameSite=Lax: 대부분의 브라우저 기본값. 동일한 사이트 요청 및 최상위 탐색을 유발하는 GET 크로스 사이트 요청에 쿠키 전송. CSRF 방어와 사용자 경험 사이의 균형을 맞춥니다.
  • SameSite=None: 가장 유연. 모든 크로스 사이트 요청에 쿠키 전송. Secure 속성(HTTPS 필수)과 함께 사용해야 하며, 서드파티 쿠키 등 특수한 경우에 사용됩니다. 이 경우 추가적인 CSRF 토큰 등 방어 대책이 필수적입니다.

4. 다양한 유효 기간의 존재

인증 시스템에서는 여러 요소에 대한 만료 기간이 존재하며, 각기 다른 역할을 합니다.

  1. 쿠키의 만료 기간 (Expires 또는 Max-Age): 브라우저가 쿠키를 언제 삭제할지를 결정합니다.
  2. 액세스 토큰의 유효 기간 (exp 클레임): 서버가 API 요청 시 액세스 토큰의 유효성을 검증하는 시간으로, 보통 짧게 설정됩니다.
  3. 리프레시 토큰의 유효 기간 (exp 클레임): 서버가 새로운 액세스 토큰 발급 시 리프레시 토큰의 유효성을 검증하는 시간으로, 액세스 토큰보다 길게 설정됩니다.

일반적으로 리프레시 토큰을 담는 쿠키의 Max-Age는 리프레시 토큰 자체의 유효 기간과 비슷하게 설정됩니다.


참고 자료 및 공식 문서

+ Recent posts