Amazon s3
s3 : simple storage service
어떤 정보(= 파일) 를 저장하는 서비스, 간단한 저장 서비스
s3 를 쓰는 이유
어떤 서버를 구축해서 저장하는 서비스를 만들 수도 있지만, 아마존에서 제공하는 서비스를 사용하면 많은 것들을 신경 쓰지 않고 안전하게 파일을 보관할 수 있습니다. (유실 가능성 거의 없음. 약 99.9%) (s3 의 서버는 죽을 걱정 거의 안해도 됩니다.)
s3 보안 방식
amazon s3 는 ssl 을 통해 데이터 전송과 데이터 업로드 후 자동 암호화를 지원합니다.
(ssl 은 암호화 방식)
이벤트 알림 전송
amazon s3 는 amazon s3 에 객체가 업로드 되면 이벤트 알림을 전송할 수 있습니다.
즉, 스토리지와 연계된 다른 서비스를 사용하는데 편리하게 사용할 수 있습니다.
파일을 업로드 -> 인코딩 서비스를 자동화
구성요소
버킷, 폴더, 오브젝트(= 파일)
리디렉션이란
리디렉션은 방문자에게 초기에 요청한 URL이 아닌 다른 URL을 제공하는 행위입니다. URL을 리디렉션하는 이유는 여러 가지가 있습니다. 예를 들어 사이트가 새 주소로 이동했거나 여러 페이지를 하나의 페이지로 통합했을 때 사용할 수 있습니다.
리디렉션을 언급한 이유는 클라이언드가 s3 에 이미지 업로드하는 로직은 다음과 같다.
- 클라이언트가 백엔드에게 인증 헤더와 함께 s3 url 을 요청
- 백엔드는 결과값으로 s3 url 을 보내줌 (여기서 인증 키값과 함께 보내줌)
- 클라이언트는 그 s3 url 에 이미지를 업로드 함
3번에서 중요한 것은 클라이언트에서 s3 url 로 이미지 업로드할 시 인증 헤더를 제거해야 한다는 것이다.
왜냐하면 이미 1번에서 인증 헤더로 요청했기 때문에 인증 키? 같은 것을 받았을 것이다. 근데 3번에서 url 에 인증헤더를 또 보내면 중복적인 인증 방식이 이루어지기 때문에 에러가 났었던 것 같다.
나는 flutter dio 패키지를 이용하고 있었는데 이 dio 패키지는 인증헤더를 무조건 거쳐서 HTTP 요청이 이루어지기 때문에 하는 수 없이 s3 url 요청은 dio 패키지를 이용하지 않았다.
(= dio 패키지를 이용하는 방법을 찾아봤는데 좀처럼 해결되지 않았다.)
다음과 같은 코드를 작성하면 정상적으로 s3 에 이미지가 업로드되었다.
class FileService {
final _api = Get.find<ApiClient>();
Future<String> addImage(String image) async {
try {
final parameters = {'type': 'image', 'mimeType': 'image/png'};
final response = await _api.get(Endpoints.filesUpload, queryParameters: parameters);
final result = response.data;
var s3Response = await http.put( // dio 패키지 사용 X
Uri.parse(result['url']),
headers: {
'Content-Type': 'application/octet-stream',
},
body: await File(image).readAsBytes(),
);
if (s3Response.statusCode == 200) {
return '${Constants.imageBaseUrl}${result['path']}';
} else {
throw Exception(result['message']);
}
} catch (e) {
rethrow;
}
}
}
이 글은 스택오버플로우 글을 참고하였다.
Flutter/Dart http 클라이언트에서 리디렉션 시 Authorization 헤더를 제거하는 방법
'👩🏻💻 TIL' 카테고리의 다른 글
xcode push notification not showing (0) | 2022.10.24 |
---|---|
[iOS] [Flutter] module not found. (1) | 2022.10.18 |
[Java] 추상 클래스와 인터페이스 (0) | 2022.06.12 |
[Java] extends implements 차이 (0) | 2022.06.12 |
nexus-graphql-mongoose-boilerplate 1일차 (0) | 2022.05.15 |