[Trouble] 삼성 인터넷 비디오 재생 오류 디버깅: HTTP/2와 Nginx의 불협화음

[Trouble] 삼성 인터넷 비디오 재생 오류 디버깅: HTTP/2와 Nginx의 불협화음

Hugo로 블로그를 만들고 여행 영상을 올렸다. PC(Chrome, Whale), 아이폰(Safari), 심지어 안드로이드 크롬에서도 아주 매끄럽게 잘 나온다.

그런데 유독 삼성 인터넷 브라우저(Samsung Internet)에서만 영상이 로딩만 돌다가 죽어버린다. 서버 로그에는 정상적으로 200/206 응답이 나가는데 클라이언트는 묵묵부답.

결국 꼬박 하루를 날려먹고 원인을 찾았는데, 결론부터 말하자면 삼성 인터넷의 저질스러운 표준 호환성 때문이었다. 나와 같은 피해자가 더 생기지 않길 바라는 마음으로, 이 거지 같은 트러블슈팅 기록을 남긴다.


1. 지옥의 디버깅: “보안"이라는 핑계

PC 브라우저라면 F12 한 번이면 원인을 알 수 있다. 하지만 모바일은? 캄캄한 어둠 속이다.

처음엔 어떻게든 로그를 보려고 자바스크립트로 video 태그 에러를 캡처해서 화면에 뿌려보려 했다. 주소창에 javascript:를 쳐보기도 하고 별짓을 다 했다. 하지만 삼성 인터넷은 “보안”이랍시고 콘솔 접근이나 스크립트 실행을 아주 철저하게 막아놨다.

웃기지 않은가? 정작 표준 프로토콜인 HTTP/2 영상 재생은 제대로 처리도 못 하면서, 개발자가 버그 잡으려는 시도는 ‘보안’을 이유로 틀어막고 있다.

덕분에 내 코드가 문제인 줄 알고 엄한 ffmpeg 인코딩 옵션만 수십 번을 바꿨다. 이 과정에서 날린 내 시간은 누가 보상해주나.


2. 진실의 방: USB 디버깅

도저히 안 돼서 최후의 수단인 USB 디버깅을 사용했다. 폰을 PC에 케이블로 연결하고 크롬 chrome://inspect를 켰다.

삼성 인터넷의 내장을 뜯어보니 가관이었다.

error

비정상적인 상황 debugger로 확인

nomal

정상 동작 로그

GET https://.../video.mp4 net::ERR_FAILED 18ms
  • net::ERR_FAILED: 연결 실패.
  • 18ms: 0.018초.

서버가 데이터를 주려고 준비하기도 전에, 브라우저가 “나 이거 못 먹어!” 하고 연결을 냅다 끊어버린 거다. 404도 아니고 500도 아니다. 그냥 브라우저가 통신을 거부했다.


3. 범인은 삼성 인터넷 v29 + HTTP/2

내 서버 환경은 지극히 표준적이었다.

  • Server: Nginx 1.28.0 (자가 호스팅)
  • Protocol: HTTPS + HTTP/2

문제는 삼성 인터넷 (버전 29.0.1.11)이었다. 다른 모든 모던 브라우저들이 아무 문제 없이 처리하는 HTTP/2 미디어 스트리밍을, 삼성 인터넷 혼자서만 제대로 소화하지 못하고 체해버린 것이다.

특히 Nginx의 sendfile이나 SSL 핸드셰이크 과정에서 HTTP/2 패킷이 들어오면, 지네들 멋대로 해석 오류를 일으키고 연결을 리셋(RST) 시켜버린다. 2025년에 아직도 HTTP/2 호환성 타령을 해야 한다니 믿기지가 않는다.


4. 해결책: 기술의 퇴보

해결 방법은 허무했다. 멀쩡한 최신 기술(HTTP/2)을 끄는 것이었다. 고작 브라우저 하나 비위 맞춰주자고 서버 설정을 다운그레이드해야 한다.

수정 전 (nginx.conf)

server {
    listen 443 ssl http2; # 이게 표준이지
    ...
}

수정 후 (삼성 인터넷 전용 처방)

server {
    listen 443 ssl; # http2 제거 (하...)
    ...
    
    location ~ \.mp4$ {
        sendfile off; # 혹시 모를 SSL 버퍼 충돌 방지
    }
}

설정 파일에서 http2 글자를 지우고 Nginx를 재시작하자마자, 그렇게 안 나오던 영상이 아주 잘 나온다. 허탈함이 밀려왔다.


5. 결론: 개발자를 괴롭히지 마라

  1. 모바일 웹 디버깅은 폰만 붙잡고 있지 마라. 삼성 인터넷의 폐쇄적인 정책 때문에 시간만 버린다. 무조건 USB 꽂고 PC에서 뜯어보는 게 정신 건강에 좋다.

  2. 안 되면 프로토콜을 의심해라. 코덱 문제인 줄 알고 삽질했지만, 결국은 브라우저의 통신 방식 문제였다.

  3. 삼성 인터넷은 반성해라. 독자 규격이나 보안을 내세우기 전에, 남들 다 되는 웹 표준(HTTP/2)이나 똑바로 지원했으면 좋겠다.

전 세계를 여행하며 찍은 멋진 영상들이, 고작 브라우저 호환성 때문에 검은 화면으로 나오는 꼴을 보고 싶지 않다면, 당분간 Nginx에서 http2는 꺼두는 게 상책이다.


참고 자료