들어가기 전에
사내에서 http://A라는 도메인(공인 IP)에서 ajax로 http://B라는 도메인(사설 IP) 호출 시 net:ERR_FAILED 에러가 발생하였습니다. net:ERR_FAILED 에러의 경우 발생 원인이 다양할 수 있어 정확한 원인을 어떻게 파악할 수 있을까 고민하다가, Content-Type을 application/json이 아닌 text/plain으로 바꾸어 테스트하였습니다. 그 결과, 아래와 같이 resource가 request client에 비해 private하다는 에러가 났음을 확인하여 해당 에러와 관련하여 정리해보고자 합니다.
- application/json의 경우 POST 요청 시 preflight으로 OPTION method를 먼저 호출하게 되어 실제 오류 내용을 파악하기 어려울 것 같아 simple request인 text/plain으로 변경하여 테스트를 진행했습니다.
The request client is not a secure context and the resource is in more-private address space 'private'.
이 에러는, 공인 IP 대역에서 사설 IP 대역의 리소스를 가지고 오게 되어, 가지고 오고자 하는 리소스가 호출 주체에 비해 private 하여 발생한 에러입니다. 아래 Chrome developer 사이트에서 발최한 내용에서도 확인할 수 있듯이, Chrome 94부터는 insecure public website에서 private network를 호출할 경우 block되도록 변경되어 해당 에러가 발생했다고 볼 수 있습니다.
해결 방안
이 에러에 대해 처음 구글링을 하였을 때, chrome://flags/#block-insecure-private-network-requests에 접속하여 Block insecure private network requests를 disable하면 된다는 글이 있었습니다.
Block insecure private network requests를 disable하고 테스트해본 결과, 하기와 같이 에러 없이 ajax 호출에 성공하였습니다.
하지만, 해당 설정의 경우 사용자 PC의 크롬 브라우저 설정을 수정한 것이기 때문에 궁극적인 해결방안이 될 수 없습니다.
- 위 캡쳐사진에서 볼 수 있듯이 결과는 성공이지만, deprecation된 옵션을 사용하였음을 경고해주고 있습니다.
따라서, 실제 사용해볼 수 있는 해결방안은 크게 2가지로 나뉠 수 있습니다.
- 호출하는 주체의 scheme를 HTTPS로 변경한다.
- ajax를 통해 가져오려는 리소스를 public IP로 변경한다.
Chrome Developer 사이트에서도 확인할 수 있듯이 호출 주체가 HTTPS로 씌워져있다면 ajax로 가져오려는 리소스가 HTTP여도 문제없이 호출이 가능합니다. 다만, 호출 주체를 HTTPS로 바로 변경하기 어렵다면, 가져오려는 리소스를 public IP로 변경하는게 쉬운 방법이 될 수 있습니다.
참고 자료
'SECURITY > CHROME' 카테고리의 다른 글
[Chrome] Same-Site에서 Schemeful Same-Site로의 변화 (0) | 2021.11.18 |
---|