본문 바로가기
★ 프로젝트 + 트러블 슈팅 ★

[이미지 보안 이슈] pre_signed_url / CloudFront / S3 트러블 슈팅 (5)

by 리승우 2024. 1. 30.

Signed Url & pre-signed url


초기 구상은 하나의 s3 버킷에 대해 Cloudfront url을 통해 get과 put을 모두 수행하는 방향으로 진행하였다.

이미지 업로드 방식은 Signed Url을 통해 업로드 하였다.

이를 위해 아래 이미지와 같이 Cloudfront와 연결된 S3의 정책을 s3:getobject와 s3:putobject 모두 가능하게 설정하였는데,

위 두 정책이 한 버킷에 포함됨으로써, get을 위해 발급된 Cloudfront url을 이용하여 put도 가능해져버리는 보안 이슈가 발생하였다.

 

즉, 사용자가 이미지 GET을 위해 응답해준 URL을 바탕으로, 임의로 다른 이미지를 PUT해버릴 수 있는 이미지 보안 이슈가 발생하는 거였다.

그래서 버킷정책에서 s3:putobject를 제외시키고 Cloudfront url은 get을 하기위한 용도로만 사용하도록 수정하였다.

이렇게 되어있을 때
POST맨 같은 걸 이용해서 임의로 이미지를 변경시킬 수 있다

pre-signed url

위 보안 이슈를 해결하기 위해, 기존 버킷 정책에 있는 s3:putobject를 삭제 후, Cloudfront를 거치지 않고 안전하게 put 기능을 수행하기위해 pre_signed_url을 사용하였다.

→ 만료시간이 설정가능함, 클라이언트에 미리 인증된 url을 발급받아 파일 업로드 요청

 

pre-signed url 관련정보

- 서버단에서 pre-signed-url을 미리 발급받아, S3에 접근시킬 수 있음 (이때, HTTP Method별로 권한을 지정할 수 있음)

- 클라이언트에서 직접 S3에 대한 인증을 하기위해선 access-key, secret-key를 이용해야 하는데, 보안이슈로 인해 탈취당할 수 있음. 이를 방지하기 위해 서버단에서 pre-singed-url을 발급받아, 해당 url을 클라이언트단에 보내 보안이슈없이 s3작업을 할 수 있게 해줌

 

Signed url

  • 보안에 중점을 둔 회차 컨텐츠 이미지 파일들은 url path를 암호화함과 동시에, Cloudfront 퍼블릭키를 사용한 signed url을 생성하여 호출하였음 (만료시간 설정이 가능함, 보안기능을 더 강화할 수 있음)
  • 일반 이미지(썸네일, 배너 이미지 등)는 오버스펙이 될 것을 우려하여 signed url을 사용하지않고 그냥 cloudfront url(도메인+path)을 통해 호출

댓글