👩🏻‍💻 TIL

only one auth mechanism allowed

ji-hyun 2022. 9. 19. 00:03

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 헤더를 제거하는 방법

 

 

How to remove Authorization header on redirect on any Flutter/Dart http client

I'm currently working on a project which like a lot of other projects works with s3 storage. In this case the storage is linked via the back-end. The situation is like this, I can get the 'attachme...

stackoverflow.com