Replies: 2 comments
-
주장POST를 쓰는 게 좋다고 생각합니다. 근거파일 크기 제한PUT은 보안적으로 취약하다post는 presigned url 서명 시 파일의 최대 크기를 제한해둘 수 있습니다! 이는 브라우저 단에서 저장할 수 있는 데이터의 크기를 제한해둠으로써 무방비하게 큰 데이터가 올라오는 것을 방지할 수 있습니다. PUT으로도 브라우저에서 업로드할 데이터의 크기를 미리 전해줌으로써 제한을 둘 수 있느나, 이는 외부에서 들어오는 API의 content-length를 신뢰하겠다는 의미와 동일합니다. 만약 client가 “10KB 데이터를 줄 겁니다!”라고 업로드 데이터를 준다고 했을 때, 이후에 만들어진 presigned url은 응답으로 제공되기 때문에 사용자가 공격하고자 하면 어떤 데이터든 만료 시간 전까지 업로드가 가능합니다. 10KB를 업로드 할 것이라고 서명해두고 client가 100GB 짜리 데이터를 올리려고 하더라도, S3에서는 정확히 같은 크기의 데이터인지를 보기 위해서 그 모든 트래픽이 전송된 이후에나 알맞지 않은 데이터라는 것을 알게 됩니다! https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html 공식 문서에서도, POST에서는 max length를 policy로 지정할 수 있기 때문에 요청을 중간에 끊을 수 있다고 나와 있습니다. 아래 에러 코드에도 proposed라고 명시해두는 것을 보면 알 수 있습니다! https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html
PUT은 정확한 데이터 크기를 고집한다또한 put을 사용했을 때 정확히 같은 파일 크기를 제공해주어야 한다는 점도 하나의 단점이라고 보입니다. PUT presigner를 사용하는 입장에서는 브라우저 단에서 동작하는 파일 데이터의 업로드가 반드시 정확한 데이터 크기를 받았다고 가정합니다. 데이터를 주고 받는 네트워크 환경에서는 중간에서 프록시에 의해 데이터를 chunked 방식으로 쪼갤 수도 있고, 저희가 통제할 수 없는 데이터의 미세한 변동이 주어졌을 때에도 서비스는 업로드 실패라는 결과를 내보냅니다!
추가 이야기공식 sdk에서 제공하지 않는 기능이라 안정적이지 못하다는 우주님의 생각도 일리 있다고 생각합니다. POST로 진행하고, sdk에서 지원하지 않는 부분으로 인해 문제가 생긴다면 그때 바꾸는 방식이 어떨까요?
|
Beta Was this translation helpful? Give feedback.
-
|
#215 에서 POST를 사용할 것을 요청드렸던건 순전히 파일 크기 제한을 위해서였습니다.
POST를 사용하는 것에 비해 장점이 많습니다. 길어질 것 같아서 결론부터 말씀드리면 아래 적을 내용에도 불구하고, PUT은 정말 보안상 취약한가PUT 방식은 외부의 content-length를 신뢰하겠다는 의미여서
라고 해주셨는데 HTTP 표준에 따라 서버는 헤더의 content-length에 적혀있는 만큼만 읽어들입니다. content-length에 10KB라고 적고 body를 100GB 보내면 서버는 10KB만 읽고 멈출 것이고, 추가로.. 이 부분은 논점에서 좀 벗어난 내용인거 같지만 그냥 지나치기 아쉬워 아는척 좀 해보자면(ㅎㅎ;)
checksum은 충돌 내성이 작아 이러한 목적으로 사용하기엔 부적합 합니다. 근데 사실 이건 PUT을 쓰냐 POST를 쓰냐에서 중요하지 않은 얘긴거 같아요 그래도 POST를 사용해야한다
말씀해주신 이 부분이 치명적으로 작용하는거 같아요 얼마나 자주 저런 일이 일어날진 모르겠지만 서명 로직은 잘 테스트해보고 확인하면 되는 문제니까요 또, AWS 공식 문서에서도 SignedHeader에 content-length를 넣는 방식을 알려주진 않더라고요. 결과적으로 PUT은 파일 크기 제한을 거는데 큰 단점이 따라오니, POST 방식 사용하는게 좋을거 같아요 |
Beta Was this translation helpful? Give feedback.



Uh oh!
There was an error while loading. Please reload this page.
-
Beta Was this translation helpful? Give feedback.
All reactions