⚡ 개요
기존에 JAVA에서 FileDownload 관련해서 공통으로 만들고 API를 사용할 때, 크롬 개발자 도구에서 발생한 에러 메세지 이다. HTTPS를 보는 순간 보안 이슈가 발생했구나... 싶었고 해당 이슈 관련해서 왜 발생하는지 궁금해서 찾아보다가 내용을 정리하게 되었다.
⚡ 내용
에러 메시지 "The file at blob was loaded over an insecure connection. this file should be served over HTTPS" 는 일반적으로 Blob URL을 통해 컨텐츠에 접근하려고 할 때 발생한다. 그러나 페이지 자체는 HTTPS를 통해 제공되고 있는 동안 Blob URL은 보안되지 않은 (HTTP) 연결을 통해 제공되는 컨텐츠를 가리키고 있다. 이로 인해 보안 페이지에서 안전하지 않은 컨텐츠가 함께 로드되어 보안 연결이 손상될 수 있는 믹스드 컨텐츠 문제가 발생한다.
🚫 원인
이러한 에러가 발생하는 원인과 해결 방법은 다음과 같다 :)
- 페이지 보안: 웹페이지가 HTTPS를 통해 로드될 때 브라우저는 페이지 내에 포함된 모든 리소스(이미지, 스크립트, 스타일시트 등)가 HTTPS를 통해 로드되어야 한다고 기대한다. 이렇게 하면 사용자와 웹사이트 간의 통신이 안전하게 유지된다.
- 믹스드 컨텐츠 문제: 보안된 HTTPS 페이지에서 HTTP를 통해 제공되는 컨텐츠를 가리키는 Blob URL을 생성하고 해당 URL을 HTTPS 페이지에서 사용하려고 하면 사실상 안전한(HTTPS) 및 보안되지 않은(HTTP) 컨텐츠를 혼합하게 된다. 이는 보안 위험을 초래할 수 있는데, 공격자가 보안되지 않은 컨텐츠를 가로채거나 수정할 수 있어 페이지의 무결성이 손상될 수 있다.
HTTPS 페이지가 아닌 경우에도 해당 에러가 발생하는 이유는 다음과 같을 수 있다 :)
- Blob URL 생성: Blob URL을 생성하는 JavaScript 코드에서 보안되지 않은 컨텐츠를 참조하거나 Blob URL을 생성한 후에 해당 컨텐츠가 HTTP를 통해 제공되는 경우에도 이러한 경고가 발생할 수 있다.
- 브라우저 보안 정책: 브라우저는 보안을 위해 다양한 정책을 가지고 있다. 브라우저의 보안 정책에 따라 보안되지 않은 컨텐츠를 보안 페이지에서 로드하려고 할 때 경고를 표시할 수 있다.
👨⚕️ 해결 방안
1. 가능한 경우 모든 리소스가 Blob URL을 통해 로드되지 않더라도 HTTPS를 통해 로드되도록 해야 한다
2. 동적으로 Blob URL을 생성하는 경우 URL이 상대적이고 프로토콜(http/https)을 포함하지 않도록 해라. 이렇게 하면 URL은 사용되는 페이지의 프로토콜을 상속하게 된다
3. JavaScript 코드를 검토하여 Blob URL을 생성할 때 참조하는 컨텐츠가 보안되지 않은 HTTP 연결을 통해 제공되지 않도록 한다 (현실적으로 HTTPS를 사용하지 않을 수도 있기 때문에 적절한 방법은 아니라고 생각한다)
⚡ 마무리
브라우저 버전이 올라가고 개발이 진행됨에 따라 보안은 계속해서 강화되고 있다.
보안 관련 이슈가 발생했을 때는 최대한 경고를 줄이려고 노력하고, 컨텐츠를 안전한 방식으로 제공할 수 있도록 노력해야 한다.
참고로 localhost 로 접근시 에러 문구가 발생하지 않는다. 통신을 하더라도 내부에서 한다고 판단을 하기 때문에 에러가 발생하지 않는거 같다. 보안 관련 이슈는 많이 찾아보고 해결 사례들을 찾아보고 최선의 방법을 찾으려고 노력을 한다.위의 내용중 잘못된 내용이 있다면 알려주면 정말 감사하다. :)