우선 저희 팀의 아키텍처 - Task Management 는 기능적으로 칸반보드로 업무 관리를 하는 툴의 역할을 하도록 설계했습니다.
해당 아키텍처로 구성되는 프로그램은 Supervisor - PIC로 유저가 나뉘고, Supervisor 유저가 로그인을 하고나면 담당자 PIC 지정 부터 작업 상태, 작업 내용, 마감기한 등을 설정하는 툴입니다.
마지막, Git Action은 GitHub 레포지토리에 push된 코드들을 자동으로 각 코드들이 배포되어야할 리소스로 배포합니다. CRUD이미지는 ECS 컨테이너로, 로그인요청처리와 로그이벤트코드는 각각의 람다 함수로, 프론트 웹페이지 코드는 s3 버킷으로 배포되도록 CI/CD 파이프라인을 구성했습니다.
로그인 페이지와 Task Management 페이지 저장
Route 53 - CloudFront 배포의 값을 대체도메인으로 설정
이제 유저는 www.hoonology.click을 통해 접속을 할수 있게 됐다.
Supervisor 인증을 위한 유저 데이터 저장
인증은 로그인 시 입력한 email을 DynamoDB의 '파티션 키- 정렬키'와 비교하여
'일치 / 불일치' 여부를 판단 후 'statusCode'와 함께 로그인 '성공 / 실패'를 리턴한다.
Lambda 함수 - 'index.js'
정적 웹사이트를 통해 들어온 로그인 요청 데이터(트래픽)의 인증 계층을 Lambda에 보내는 역할
이후 ALB를 통해 내부에서만 소통하도록 함 (VPC의 보안을 위함)
1. '/dynamo_user' 리소스에 'POST'메소드로 Lambda에 트리거 되도록 함
2. 루트 리소스에서 'GET','POST' 요청으로 ALB로 연결된 백엔드 값을 조회할 수 있도록 함
3. API 게이트웨이가 Lambda에 트리거된 것을 확인
5. 루트 리소스에서 GET 요청에 따른 응답이 나온다.
DynamoDB에 저장된 로그가 EventBridge를 트리거로하여 Lambda 함수에 전달되고 그 값들을 조회할 수 있게 된다.
상태 변경 시, 이메일을 통해 로그가 수신됨을 확인할 수 있다.
브라우저 개발자 콘솔에서 확인한 결과, API Gateway, Lambda, S3의 CORS
문제였다.
Lambda
S3
API Gateway
("Principal": "*")가 s3:GetObject 및 s3:PutObject 작업을 수행하도록 허용합니다. 즉, 버킷 이름을 아는 사람은 누구나 버킷에서 읽고 쓸 수 있습니다. 이는 심각한 보안 위험입니다.
아래와 같이 정책을 업데이트하여 해결합니다.
{
"Version": "2012-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity YOUR_OAI_ID"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::login-task/*"
}
]
}
CORS 구성은 모든 오리진("AllowedOrigins": ["*"]) 을 허용합니다. 이는 모든 웹사이트가 API에 요청할 수 있음을 의미합니다. 이로 인해 잠재적으로 민감한 데이터가 악성 웹사이트에 노출될 수 있습니다.
허용된 출처를 API 액세스를 허용해야 하는 특정 도메인으로 제한합니다. 모든 도메인에서 API에 액세스해야 하는 경우 OAuth 또는 API 키와 같은 추가 보안 조치를 구현하는 것이 좋습니다.
를 'true'로 설정하면 쿠키, HTTP 인증 및 클라이언트 측 SSL 인증서가 요청과 함께 전송됨을 의미합니다. 와일드카드 출처(*)와 결합하면 악성 웹사이트가 API에 인증된 요청을 할 수 있습니다.
자격 증명을 사용해야 하는 경우 위에서 언급한 것처럼 허용된 원본을 제한해야 합니다. 또한 인증을 위해 쿠키 대신 토큰 또는 기타 메커니즘을 사용하는 것을 고려합니다.
S3 버킷 정책 및 CORS 구성은 암호화 요구 사항을 지정하지 않습니다. 이것은 잠재적으로 민감한 데이터를 노출시킬 수 있습니다.
모든 연결에 HTTPS를 사용합니다. S3의 경우 저장된 데이터에 대해 서버 측 암호화를 사용하는 것이 좋습니다.