설명
Alexa Skill의 ClientSecret을 템플릿에 직접 기록하면 저장소, 배포 자료나 템플릿 이력을 통해 노출될 수 있습니다. RefreshToken도 보호해야 하며, 유출된 인증 정보가 필요한 다른 값과 함께 사용되면 허용된 스킬 관리 작업이 악용될 수 있습니다.
이 값들은 Login with Amazon에서 발급된 실제 애플리케이션 자격 증명이어야 합니다. 임의의 비밀번호를 생성해 기존 클라이언트 비밀값 대신 사용할 수는 없습니다.
잠재적 영향
- 비밀값이 노출되어 허용된 작업을 수행하는 데 악용될 수 있습니다.
- 복사된 템플릿과 저장소 이력에 값이 남아 교체와 사고 대응이 어려워질 수 있습니다.
해결 방법
실제 ClientSecret과 RefreshToken을 Secrets Manager에 저장하고 동적 참조로 전달하세요. 배포 역할의 조회 권한을 최소화하고 로그·출력에 값이 남지 않도록 하세요. 노출된 값은 발급 서비스에서 폐기·교체하고 배포에 새 값이 반영되는지 확인하세요.
예시
인증 설정의 발췌이며 SkillPackage 등 필수 구성은 생략했습니다. ClientId·VendorId를 실제 계정에 맞추고 AlexaCredentials에 동일한 LWA 앱의 clientSecret·refreshToken을 저장하세요. 예시 문자열은 실제 인증에 사용할 값이 아닙니다.
변경 전
Resources:
MySkill:
Type: Alexa::ASK::Skill
Properties:
AuthenticationConfiguration:
ClientId: "amzn1.application-oa2-client.1234"
ClientSecret: "1234"
RefreshToken: "Atzr|1234"
VendorId: "1234"
ClientSecret과 RefreshToken이 템플릿에 직접 포함되어 있습니다. 실제 비밀값이라면 템플릿 접근자가 확인할 수 있습니다.
변경 후
Resources:
MySkill:
Type: Alexa::ASK::Skill
Properties:
AuthenticationConfiguration:
ClientId: "amzn1.application-oa2-client.1234"
ClientSecret: "{{resolve:secretsmanager:AlexaCredentials:SecretString:clientSecret}}"
RefreshToken: "{{resolve:secretsmanager:AlexaCredentials:SecretString:refreshToken}}"
VendorId: "1234"
두 비밀값을 외부에서 참조합니다. 저장소의 값만 바꿔도 CloudFormation이 자동으로 다시 읽는 것은 아니므로 해당 리소스 업데이트와 적용 결과를 확인하세요.