API Gateway 인가자 선택하기

개발자를 위한 AWS 보안 활용

Rahul Singh

Technical Product Manager

코드 실행 전에 확인됩니다

호출자가 API Gateway 인가자를 거쳐 코드에 도달하며, 거부된 호출자는 401 응답과 함께 돌아갑니다.

통과: 요청이 코드에 도달합니다

실패: 401 Unauthorized, 코드가 실행되지 않습니다

개발자를 위한 AWS 보안 활용

누가 확인하는가

선택 가능한 세 가지 인가자
  1. IAM 인증 (AWS_IAM): AWS가 서명을 확인합니다

AWS가 확인하는 방식에서 직접 확인하는 방식까지 이어지는 세로 축. 첫 번째 카드만 채워져 있으며, AWS가 서명을 확인하는 IAM 인증입니다.

개발자를 위한 AWS 보안 활용

누가 확인하는가

선택 가능한 세 가지 인가자
  1. IAM 인증 (AWS_IAM): AWS가 서명을 확인합니다
  2. Cognito 인가자 (COGNITO_USER_POOLS): AWS가 토큰을 검증합니다
    • 서명, iss, aud, exp

동일한 세로 축에 두 개의 카드가 채워져 있습니다. AWS가 서명을 확인하는 IAM 인증과, AWS가 토큰을 검증하는 Cognito 인가자입니다.

개발자를 위한 AWS 보안 활용

누가 확인하는가

선택 가능한 세 가지 인가자
  1. IAM 인증 (AWS_IAM): AWS가 서명을 확인합니다
  2. Cognito 인가자 (COGNITO_USER_POOLS): AWS가 토큰을 검증합니다
    • 서명, iss, aud, exp
  3. Lambda 인가자: 함수가 허용 또는 거부를 반환합니다
    • Cognito가 아닌 토큰용

AWS가 확인하는 방식에서 직접 확인하는 방식까지 순위별로 나열된 세 가지 인가자: AWS가 서명을 확인하는 IAM 인증, AWS가 토큰을 검증하는 Cognito 인가자, 직접 확인 로직을 작성하는 Lambda 인가자입니다.

개발자를 위한 AWS 보안 활용

호출자에 맞는 문을 선택하세요

 

호출자가 결정합니다

 

  • 내부 서비스: 이미 AWS 자격 증명을 보유

호출자와 인가자를 매칭하는 세 행 중 첫 번째: 내부 서비스가 IAM 인증에 매칭됩니다.

개발자를 위한 AWS 보안 활용

호출자에 맞는 문을 선택하세요

 

호출자가 결정합니다

 

  • 내부 서비스: 이미 AWS 자격 증명을 보유
  • 앱 사용자: Cognito 토큰을 소지

호출자와 인가자를 매칭하는 세 행 중 두 개: 내부 서비스는 IAM 인증에, 앱 사용자는 Cognito 인가자에 매칭됩니다.

개발자를 위한 AWS 보안 활용

호출자에 맞는 문을 선택하세요

 

호출자가 결정합니다

 

  • 내부 서비스: 이미 AWS 자격 증명을 보유
  • 앱 사용자: Cognito 토큰을 소지
  • 파트너 앱: 자체 인가 로직을 사용

세 호출자가 각각 필요한 인가자에 매칭됩니다: 내부 서비스는 IAM 인증에, 앱 사용자는 Cognito 인가자에, 파트너 앱은 Lambda 인가자에 매칭됩니다.

개발자를 위한 AWS 보안 활용

API 유형에 유의하세요

REST API

  • 세 가지 인가자 모두, 그리고 리소스 정책까지
  • API 키, 클라이언트별 제한, 요청 검증, WAF

REST API를 위한 비교 카드로, IAM 인증, Cognito 사용자 풀 인가자, Lambda 인가자, 리소스 정책에 체크되어 있습니다. 옆에 있는 HTTP API 카드는 아직 채워지지 않았습니다.

개발자를 위한 AWS 보안 활용

API 유형에 유의하세요

REST API

  • 세 가지 인가자 모두, 그리고 리소스 정책까지
  • API 키, 클라이언트별 제한, 요청 검증, WAF

 

HTTP API

  • JWT 인가자, 모든 OIDC 발급자 지원
  • 리소스 정책 없음, 더 저렴하고 빠름

각 API 유형이 지원하는 인가자를 비교하는 두 카드: REST API는 리소스 정책을 추가로 지원하고, HTTP API는 Cognito 인가자 대신 JWT 인가자를 사용하며 리소스 정책이 없습니다.

개발자를 위한 AWS 보안 활용

인가자는 결과를 기억합니다

시간을 절약하는 캐싱

  • 첫 호출: 인가자가 실행됩니다
  • 이후 호출: 캐시된 결과를 읽습니다

첫 호출은 인가자를 실행하고 유효 기간이 있는 캐시에 허용 결과를 기록하며, 이후 호출은 인가자를 다시 실행하지 않고 캐시에서 그 허용 결과를 읽습니다.

개발자를 위한 AWS 보안 활용

인가자는 결과를 기억합니다

시간을 절약하는 캐싱

  • 첫 호출: 인가자가 실행됩니다
  • 이후 호출: 캐시된 결과를 읽습니다

 

캐시 TTL

  • authorizerResultTtlInSeconds: 기본 300초, 최대 3600초
  • 0으로 설정하면 캐싱이 비활성화됩니다

첫 호출은 인가자를 실행하고 유효 기간이 있는 캐시에 허용 결과를 기록하며, 이후 호출은 인가자를 다시 실행하지 않고 캐시에서 그 허용 결과를 읽습니다.

개발자를 위한 AWS 보안 활용

캐시된 허용은 권한보다 오래 남을 수 있습니다

두 개의 레인으로 구성된 타임라인입니다. 권한 레인은 회수 시점에 유효에서 회수됨으로 바뀌지만, 아래의 캐시된 허용 레인은 그 시점 이후에도 여전히 허용 상태를 보이며, 회수 이후 구간이 음영 처리되어 있습니다.

권한을 회수하는 순간

  • 권한: 즉시 회수됨
  • 캐시된 허용: 여전히 접근을 허용
개발자를 위한 AWS 보안 활용

캐시된 허용은 권한보다 오래 남을 수 있습니다

동일한 두 레인 타임라인에서 회수 시점과 TTL 만료 사이의 구간이 음영 처리되고 '여전히 허용됨'으로 표시되어 있습니다. 권한은 회수되었지만 캐시된 허용이 계속 접근을 허용합니다.

그 사이의 구간

  • 권한은 사라졌지만 캐시는 알지 못합니다
  • TTL이 만료될 때까지 접근이 유지됩니다
개발자를 위한 AWS 보안 활용

캐시된 허용은 권한보다 오래 남을 수 있습니다

동일한 두 레인 타임라인에서 음영 구간에 화살표가 표시되어, 짧은 TTL이 만료 시점을 앞당기고 회수된 권한이 여전히 접근을 허용하는 구간을 줄여주는 모습을 보여줍니다.

그 구간을 통제하세요

  • 신속한 회수가 필요하면 TTL을 짧게 설정
  • 가장 민감한 경로는 TTL 0으로 설정
개발자를 위한 AWS 보안 활용

한 호출자가 정문을 건너뜁니다

계정 내부의 제3자

  • 사용자가 생성한 역할을 수임합니다
  • 역할 ARN을 전달합니다

모니터링 벤더가 위쪽의 두 고객 박스와 아래쪽의 사용자 역할 사이에 위치합니다. 사용자 박스는 역할 ARN을 벤더에게 전달하고, 벤더는 사용자의 역할을 수임합니다. 두 번째 고객 박스는 회색으로 표시되어 아직 이야기에 등장하지 않았습니다.

개발자를 위한 AWS 보안 활용

한 호출자가 정문을 건너뜁니다

계정 내부의 제3자

  • 사용자가 생성한 역할을 수임합니다
  • 역할 ARN을 전달합니다

역할 ARN은 비밀 정보가 아닙니다

혼란스러운 대리인 문제

이제 두 번째 고객 박스가 빨간색으로 활성화되어 마치 자신의 것인 양 사용자의 역할 ARN을 전달합니다. 이제 모니터링 벤더에서 사용자의 역할로 이어지는 화살표가 두 개 있으며, 고객당 하나의 호출이지만 둘을 구분할 방법이 없습니다.

개발자를 위한 AWS 보안 활용

한 호출자가 정문을 건너뜁니다

계정 내부의 제3자

  • 사용자가 생성한 역할을 수임합니다
  • 역할 ARN을 전달합니다

역할 ARN은 비밀 정보가 아닙니다

혼란스러운 대리인 문제

해결책: sts:ExternalId

  • 벤더가 고객마다 하나씩 생성합니다
  • 사용자의 신뢰 정책이 일치를 요구합니다

이제 사용자의 역할은 외부 ID가 12345와 일치해야 한다는 요구 사항을 포함합니다. 12345를 전달하는 호출은 역할에 도달하지만, 99999를 전달하는 호출은 빨간 X 표시로 도달 전에 차단됩니다.

개발자를 위한 AWS 보안 활용

연습해 봅시다!

개발자를 위한 AWS 보안 활용

Preparing Video For Download...