Home Nginx & Spring Boot 구성하기(3) SSL 설정과 Socket
Post
Cancel

Nginx & Spring Boot 구성하기(3) SSL 설정과 Socket

SSL 인증서 연동은 아주 쉽다. Nginx 설정은 쓰는 느낌만 알면 접근하기 쉬운듯 하다 ~.~

OpenSSL 인증서 발급

brew로 openssl 설치

1
brew install openssl

관련 내용 추후 추가 예정..

Nginx SSL 인증서 적용

default.conf (환경에 따라 nginx.conf) 수정하기

기존의 defautl.conf

1
2
3
4
5
6
7
8
9
10
11
12
server {
    listen          80; # HTTP
    server_name     domain.com;

    location / {
        root        html;
        index       index.html index.htm;

        proxy_pass  http://localhost:9090;
        ...
    }
}

먼저 사용하는 포트 HTTPS(443)으로 바꿔주고

1
listen 443 ssl;

갖고 있는 SSL 인증서 적용하기

1
2
3
4
5
6
7
8
9
10
11
server {
    listen              443 ssl; # HTTPS
    server_name         domain.com;

    ssl_certificate     {파일경로}.{파일명}.crt # crt, pem .. 
    ssl_certificate_key {파일경로}.{파일명}.key; # .key

    location / {
        ...
    }
}

인증서 비밀번호가 있는 경우 비밀번호가 텍스트로 저장된 파일을 준비하고 SSL 인증서 설정 아래 함께 추가해준다.

1
ssl_password_file       {파일경로}.{파일명};

마지막으로 HTTP(80)으로 접근했을 때 추가하여 HTTS(443)으로 리다이렉트 해주기

1
2
3
4
5
6
7
8
server {
    listen          80; # HTTP
    server_name     domain.com;

    location / {
        return      301 https://$host$request_uri; # https://$server_name$request_uri;
    }
}

HTTP 응답 상태 코드 301 (Permanently Moved) : 요청된 리소스가 영구적으로 이동되었다.

그리하여 전체 코드를 보면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 80 > 443
server {
    listen              80; # HTTP
    server_name         domain.com;

    location / {
        return          301 https://$host$request_uri; # https://$server_name$request_uri;
    }
}

server {
    listen              443 ssl; # HTTPS
    server_name         domain.com;

    ssl_certificate     ssl.crt # crt, pem .. 
    ssl_certificate_key ssl.key; # .key
    ssl_password_file   ssl_pw.txt;

    location / {
        root            html;
        index           index.html index.htm;

        proxy_pass      http://localhost:9090;
        # 기타 proxy 설정 ..
    }
}

Nginx Socket 설정

Nginx는 버전 1.3부터 ​​WebSocket을 지원하며 WebSocket의 로드 밸런싱을 수행할 수 있다.

HTTP에서 WebSocket으로 연결 전환시 HTTP의 Upgrade 및 Connection 헤더를 사용한다. WebSocket을 지원할 때 리버스 프록시 서버가 직면하는 몇 가지 문제가 있다. 하나는 WebSocket이 hop-by-hop 프로토콜이므로 프록시 서버가 클라이언트의 Upgrade 요청을 가로챌 때 적절한 헤더를 포함하여 WAS 서버에 업그레이드 요청을 보내야 한다는 것이다. 또한 HTTP의 단기 연결과 달리, WebSocket은 오래 지속되기 때문에 리버스 프록시는 연결을 닫지 않고 열린 상태로 유지하는 것을 허용해야 한다.
Nginx는 클라이언트와 WAS 간 터널(소켓)을 설정할 수 있도록 WebSocket을 지원한다. Nginx가 클라이언트에서 WAS로 업그레이드 요청을 보내려면 Upgrade 및 Connection 헤더를 명시적으로 설정해야 한다.

앞선 포스팅에도 적었지만 Nginx 프록시 환경에서 소켓 통신 시 필수로 설정해줘야할 것

1
2
3
4
5
6
7
8
9
10
11
12
13
14
location / {

    proxy_pass          http://localhost:9090;
    ...

    proxy_http_version  1.1; # HTTP/1.1 버전에서 지원하는 프로토콜 전환 메커니즘 사용

    # hop-by-hop 헤더 사용
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    # 받는 대상 서버(WAS)
    proxy_set_header Host $host;
}

hop 이란
영어 자체로는 건너뛰는 모습을 의미. 데이터 통신망에서 각 패킷이 매 노드(또는 라우터)를 건너가는 모습 비유적으로 표현한다. 이러한 체계를 hop-by-hop 체제라고 한다.
홉 프로토콜은 공유 레이어 1 네트워크를 통해 신뢰성 없이 신속하게 토큰을 전송하는 메커니즘이다.



NGINX 웹 소켓 프록시 설정 https://hyeon9mak.github.io/nginx-web-socket-proxy-configuration/
빠른 토큰 전송으로 껑충, 크로스 체인 브리징 프로토콜 ‘홉(HOP)’ https://kr.beincrypto.com/learn-kr/%EB%B9%A0%EB%A5%B8-%ED%86%A0%ED%81%B0-%EC%A0%84%EC%86%A1%EC%9C%BC%EB%A1%9C-%EA%BB%91%EC%B6%A9-%ED%81%AC%EB%A1%9C%EC%8A%A4-%EC%B2%B4%EC%9D%B8-%EB%B8%8C%EB%A6%AC%EC%A7%95-%ED%94%84%EB%A1%9C%ED%86%A0/

This post is licensed under CC BY 4.0 by the author.

MAC CORS 무시하고 크롬 실행하기

-