s3에서는 보안을 위해 데이터 저장 및 전송 시 암호화할 수 있는 방식을 제공한다. 암호화를 하는 주체에 따라 서버측 암호화, 클라이언트 측 암호화로 나뉜다.
이 방식은 데이터가 S3서버에 의해 암호화된다. 데이터가 저장될 때 암호화되어 저장되고, 데이터 인출시에는 복호화되어 반환된다. AWS에서는 아래 세가지 방식을 지원하고 있다.
Amazon S3에서 관리되는 키로 데이터를 암호화하는 방식이다. Amazon S3에 의해 주기적으로 키가 교체되며 AES-256 알고리즘으로 암호화된다. 암호화에 대한 추가적인 비용이 발생하지 않으며 버킷 정책을 추가하여 객체 업로드 시 암호화 요청이 포함되지 않은 경우 업로드를 거부하도록 설정할 수 있다.
SSE-KMS는 중앙에서 키를 관리할 수 있도록 하는 AWS의 키 관리 서비스이다. 이 방식을 이용하면 사용자 단위로 권한을 부여할 수 있고 사용률 감사 등 세부적인 키 관리가 가능하다. 키 관리 및 추적이 용이한 대신 요청 당 비용이 부담된다.
헤더에 "x-amz-server-side-encryption": "aws:kms"
를 추가하면 S3는 AWS KMS keys를 사용하여 데이터를 암호화한다.
위 두 방식은 서버에서 키를 가져와 암호화를 하는 반면 SSE-C는 고객 제공 키로 암호화를 한다. 데이터 인출 시에는 S3는 고객으로부터 제공받은 키가 일치하는지 확인 후 복호화하여 전송한다. S3는 키를 별도로 저장하지 않아 사용자가 키 관리를 해야하며 S3로 키를 함께 전송해야하기 때문에 반드시 HTTPS 프로토콜을 통해야한다.
데이터 저장 시에 s3에 의해 암호화가 되는 서버측 암호화와는 달리, 클라이언트 측 암호화 방식은 데이터 업로드 전에 암호화를 한 후 전송하는 방식이다. 데이터 인출 시에도 클라이언트 측에서 복호화를 해야한다. 따라서 클라이언트가 키 관리와 암호화/복호화를 모두 맡게 되며, S3는 암호화에 전혀 관여하지 않는다.