이미지 업로드를 클라이언트에서 하면 안되는 걸까?

정민·2022년 12월 9일
0

문제상황

  • 서버에게 부하를 최대한 줄이기 위해, 클라이언트에서 이미지를 업로드 하자!
  • 클라이언트에서 Object Storage 업로드 하려고 찾아보니까 계속 CORS 오류가 뜸..

결론

1) 클라이언트가 이미지 전송 → 서버가 object storage에 업로드 → 서버가 url DB에 저장

  • 클라이언트 : 전송만 함
  • 서버 : multer를 통해 클라이언트가 쏴준 데이터를 받아옴(대략적으로 구현 되어있음...), object storage에 업로드(대략적으로 구현 되어 있음…), DB에 저장

단점. 업로드가 전적으로 서버에게 맡겨지는 것이기 때문에, 서버의 부하가 존재할 수 있을 것 같다.

2) 클라이언트가 서버에게 signed request url 요청 → 받아온 후 object storage에 업로드 → 서버에게 url 전달

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property

  • 클라이언트 : signed url로 object storage에 업로드, url 전송
  • 서버 : signed url 만들어서 내려줌, url db에 저장
export const makeSignedURL = (S3:AWS.S3, contentHash:String, musicName:String):string =>{
    const params = {Bucket: 'xoxo', Key: `${contentHash}/${musicName}`, Expires: 60};
    const url = S3.getSignedUrl('putObject', params);
    return url;
}

이런식으로 서버가 signed url을 만들어서 클라이언트가 요청하면 내려주는 것.

(서버가 올릴 파일에 대한 경로와 이름을 다 설정한 url을 내려주고, 클라이언트는 그걸 받아서 파일만 업로드 하는 것임!)

  • 유효기간 설정 가능 (이걸로 한다면 무조건 설정해야할 듯)

단점. 아무래도 보안에 있어서 좀 취약해질 수도 있을 것 같다. (누군가가 url을 탈취한다면 기존 파일의 이름과 경로가 동일한 파일을 업로드 할 수 있음⇒파일이 덮어써질 가능성이 있음)

https://campkim.tistory.com/66

https://aws.amazon.com/ko/blogs/compute/uploading-to-amazon-s3-directly-from-a-web-or-mobile-application/

https://medium.com/@cpatarun/client-side-vs-server-side-file-upload-to-amazon-s3-5c46ac0f4c7f

https://mygumi.tistory.com/380

결론

보안을 위해 서버에서 업로드하도록 하자…

profile
괴발개발~

0개의 댓글