HTTPS 강제, 프록시 및 초대 관련 문제

제 Discourse 인스턴스는 프록시 뒤에 있습니다:

server {
    server_name forum.[...];

    location / {
        proxy_pass http://IP_ADDRESS;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;

    }

    client_max_body_size 10m;

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/forum.[...]/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/forum.[...]/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = forum.[...]) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name forum.smbcn.org;

    listen 80;
    return 404; # managed by Certbot

}

이 설정은 Discourse가 설치된 서버(표준 Docker 설치)로 이어집니다:

server {
        listen 80; listen [::]:80;
        server_name forum.[...];

        client_max_body_size 10m;

        location / {
                proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
                proxy_set_header Host $http_host;
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;
        }
}

HTTPS를 강제 적용하면 초대받은 사용자가 가입으로 진행할 수 없습니다. CSRF 토큰은 정상적으로 생성되었음에도 브라우저 로그에 403 오류(잘못된 CSRF)가 표시됩니다. HTTPS를 강제하지 않으면 초대 기능은 정상적으로 작동합니다.

HTTPS 요청을 HTTP로 프록시하는 방식에 문제가 있는 것 같습니다. 누락된 헤더가 있는 건지 모르겠습니다.

아무래도 내가 정말 중요한 부분을 놓치고 있는 것 같습니다. HTTPS를 강제할 수 없다는 것은 로고가 표시되지 않는다는 것을 의미합니다(지금은 그다지 심각한 문제는 아닙니다). 오늘 Sidekiq에서 작업을 삭제하려고 할 때 CSRF 관련 오류(“forbidden”)가 발생한다는 것도 알게 되었습니다. /var/discourse/shared/standalone/log/rails/unicorn.stderr.log 파일에서 다음 내용을 발견했습니다:

WARN – : attack prevented by Rack::Protection::HttpOrigin

정말 막막한 기분입니다. 도움을 주시면 감사하겠습니다.

아마도 프론트 프록시에서 HTTPS를 활성화하고, Discourse에서는 비활성화하면 될 것 같습니다.

@hawm 이건 제 현재 설정인 것 같습니다.

$scheme 변수는 어떻게 설정하고 계신가요?

저는 설정하지 않습니다. 기본값에 의존하는 것 같습니다. 이것이 잘못된 것일까요?

프록시를 사용 중이라면 문제가 발생할 수 있습니다. 제 경험상, 여러분이 설명하고 있는 문제의 가장 흔한 원인이 바로 이것입니다. 대신 "https"로 설정해 보세요(변수는 생략하고 "https"만 직접 입력하는 것도 좋습니다).

@michaeld 네! 완벽하셨어요! 정말 감사합니다!