"Handshake failed due to invalid Upgrade header: null"

Yunny.Log ·2022년 5월 29일
1

Debugging

목록 보기
18/69
post-thumbnail

  • 일반적으로 HTTPS(SSL)로 사이트를 설정하기 위해
    도메인에 무료 인증서를 등록하고
    그 인증서를 서버내부 + 도메인 이름에 엮어서 저장하고
    nginx로 들어오는 요청에 대해서 SSL로 요청하도록 443번 포트로 Redirect를 하도록 설정해놓은 상황이다.

(아래 첨부한 블로그의 개발자님과 동일한 상태)

내 기존 location 들 ,

       location / {
               proxy_pass http://아이피주소;
               proxy_set_header Host $host;
               proxy_set_header X-Real-IP $remote_addr;
               proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
               proxy_set_header X-Forwarded-Proto $scheme;
               }

웹소켓은 기본적으로 HTTP 프로토콜을 이용하여 그 연결을 끊지 않고 유지시켜주는 방식으로 동작하기 때문에 반드시 header에 websocket으로 upgrade한다는 것을 명시
아래를 추가

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;

참고 블로그 :
https://andonekwon.tistory.com/69

나도 이처럼 아래 설정만 추가해주니 바로 에러가 사라졌다!

이유가 궁금해서 더 찾아보니,

nginx의 설명은
=> http://nginx.org/en/docs/http/websocket.html

-by-hop headers including “Upgrade” and “Connection” are not passed from a client to proxied server, therefore in order for the proxied server to know about the client’s intention to switch a protocol to WebSocket, these headers have to be passed explicitly:

    server {
        ...

        location /chat/ {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }
  • 이를 번역하면 위의 헤더를 추가하는 이유는 아래와 같다고 한다.
  • "Upgrade" 및 "Connection"을 포함한 홉별 헤더는 클라이언트에서 프록시 서버로 전달되지 않으므로 !! 프록시 서버가 프로토콜을 WebSocket으로 전환하려는 클라이언트의 의도를 파악하기 위해, 헤더를 명시적으로 전달해야 한다.

조금 더 위의 내용을 정리해보자면,

클라이언트와 서버 간의 연결을 HTTP / 1.1에서 WebSocket으로 전환 하기 위해 HTTP / 1.1에서 사용 가능한 프로토콜 스위치 메커니즘이 사용된다고 한다.

그러나 업그레이드는 hop-by-hop 헤더이기 때문에 클라이언트에서 프록시 서버로 전달되지 않는다고 한다.

정방향 프록시(Forward Proxy)를 사용하면 클라이언트가 CONNECT 메서드를 사용 하여이 문제를 피할 수 있다.

그러나 클라이언트가 프록시 서버를 인식하지 못하고 프록시 서버에서의 특수 처리가 필요하므로 리버스 프록시에서는 작동하지 않습니다.

버전 1.3.13부터 nginx는 프록시 서버가 코드 101 (스위칭 프로토콜)로 응답을 반환하고 클라이언트가 요청의“업그레이드”헤더를 가지게 해준다.

  • 위에서 언급 한 바와 같이, "업그레이드"및 "연결"을 포함한 홉별 헤더는 클라이언트에서 프록시 서버로 전달되지 않는다

  • 프록시 서버가 클라이언트가 프로토콜을 WebSocket으로 전환하려는 클라이언트의 의도를 알 수 있도록하기 위해이 헤더를 명시적으로 전달해야 한다.

한 줄 요약 :

프로토콜을 WebSocket으로 전환하려는 클라이언트의 의도를 알 수 있도록하기 위해이 헤더를 명시적으로 전달해야 한다

(+) 리버스 프록시

Reverse Proxy는 클라이언트로부터의 요청을 받아서(필요하다면 주위에서 처리한 후) 적절한 웹 서버로 요청을 전송한다. 웹 서버는 요청을 받아서 평소처럼 처리를 하지만, 응답은 클라이언트로 보내지 않고 Reverse Proxy로 반환한다. 요청을 받은 Reverse Proxy는 그 응답을 클라이언트로 반환
https://brainbackdoor.tistory.com/113

0개의 댓글