최근 기존 서비스의 HTTP 요청을 HTTPS로 전환하는 작업을 하고 있었다.
외부 API도 HTTPS로 바꾸고 인증서나 TLS 설정도 확인하다 보니, 이번에는 서비스 자체의 HTTP/HTTPS 설정도 보게 됐다.
그런데 설정을 보다 보니 한 가지 궁금한 게 생겼다.
HTTPS로 전환한다고 해서 HTTP를 무조건 막아야 하나?
HTTP와 HTTPS를 둘 다 사용할 수도 있지 않을까?
기존 서비스에 영향을 주지 않으면서 HTTPS도 사용할 수 있어야 하는 경우라면 이 부분을 먼저 확인해야 할 것 같았다.
HTTP와 HTTPS를 둘 다 열어두는 건 가능하다
처음에는 HTTPS를 적용하면 기존 HTTP 접속을 HTTPS로 무조건 넘겨야 하는 줄 알았다.
그런데 HTTP와 HTTPS를 동시에 서비스하는 것 자체는 가능하다.
예를 들어 서버에서
HTTP : 8080
HTTPS : 8443
처럼 각각의 Connector가 정상적으로 열려 있다면 두 방식으로 요청을 받을 수 있다.
http://example.com:8080
https://example.com:8443
즉, HTTPS를 사용할 수 있게 만드는 것과 HTTP 접속을 막는 것은 별개의 문제였다.
다만 서버에서 두 포트를 열어놨다고 해서 끝나는 건 아니었다.
애플리케이션에서 **HTTP 요청을 HTTPS로 강제하는 설정이 있는지도 확인해야 했다.

Spring Security의 requires-channel
이번에 Spring Security 설정을 보면서 확인한 게 requires-channel이었다.
예를 들어 이런 설정이 있다고 해보자.
<intercept-url pattern="/login/**"
access="permitAll"
requires-channel="https" />
여기서
requires-channel="https"
가 지정되어 있으면 해당 URL은 HTTPS를 요구한다.
사용자가 HTTP로 접근하면 Spring Security가 HTTPS 채널로 전환하도록 처리할 수 있다.
반대로
requires-channel="http"
를 사용하면 HTTP를 요구하게 된다.
그런데 HTTP와 HTTPS 둘 다 허용하고 싶은 URL이라면 특정 채널을 강제할 필요가 없다.
예를 들어:
<intercept-url pattern="/**"
access="permitAll" />
처럼 채널을 강제하지 않는 식이다.
이 경우 요청이 HTTP로 들어왔다고 해서 Spring Security가 무조건 HTTPS로 바꾸지는 않는다.
requires-channel을 빼면 HTTPS가 안 되는 건가?
여기서 처음에 조금 헷갈렸다.
requires-channel="https"를 제거하면 HTTPS를 사용하지 못하는 건가 싶었는데 그렇지는 않았다.
requires-channel은
HTTPS를 사용할 수 있게 만드는 설정
이라기보다
이 요청은 어떤 채널로 들어와야 하는지를 강제하는 설정
에 가깝다.
그래서 서버에서 HTTP와 HTTPS를 모두 받을 수 있도록 구성되어 있고 Spring Security에서 특정 채널을 강제하지 않는다면,
HTTP 요청
↓
그대로 HTTP 처리
HTTPS 요청
↓
그대로 HTTPS 처리
처럼 둘 다 사용할 수 있다.

그런데 설정을 지웠는데도 HTTPS로 넘어간다면?
이 부분도 같이 알아둘 필요가 있었다.
Spring Security에서 requires-channel="https"를 제거했다고 해서 무조건 HTTP로 접속되는 건 아니다.
HTTP → HTTPS 전환은 다른 곳에서도 설정할 수 있기 때문이다.
예를 들어 앞단에 웹서버나 프록시가 있다면 그쪽에서 HTTPS로 넘기고 있을 수도 있다.
구조가 이런 식이라면:
사용자
↓
웹서버 / 프록시
↓
WAS
↓
Spring Security
Spring Security 설정만 보고 판단하면 안 된다.
웹서버에서 이미
HTTP 요청
↓
301 / 302
↓
HTTPS
로 보내고 있다면 애플리케이션까지 HTTP 요청이 그대로 들어오지 않을 수도 있다.
그래서 HTTP와 HTTPS를 둘 다 사용하려면 결국 어디에서 HTTPS를 강제하고 있는지부터 확인해야 한다.

HTTP와 HTTPS를 같이 쓰려면 결국 세 군데를 봐야 했다
처음에는 Spring Security XML만 수정하면 되는 문제라고 생각했는데, 실제로는 조금 더 나눠서 볼 필요가 있었다.
첫 번째는 서버다.
HTTP와 HTTPS 요청을 실제로 받을 수 있도록 각각의 포트나 Connector가 구성되어 있어야 한다.
두 번째는 웹서버나 프록시다.
앞단에서 HTTP 요청을 HTTPS로 강제 리디렉션하고 있다면 WAS 설정과 상관없이 HTTP 접속이 유지되지 않는다.
세 번째가 애플리케이션이다.
Spring Security의 requires-channel처럼 특정 URL에 HTTPS를 강제하는 설정이 있는지 확인해야 한다.
정리하면 이런 구조다.
[HTTP / HTTPS 요청]
↓
웹서버·프록시
HTTPS 강제 여부 확인
↓
WAS
HTTP/HTTPS 포트 확인
↓
Spring Security
requires-channel 확인
한 군데만 보고 판단하면 안 되는 이유가 이거였다.
그렇다고 HTTP를 계속 열어두는 게 좋은 건 아니다
기술적으로 둘 다 사용할 수 있다고 해서 운영 서비스에서 항상 둘 다 유지하는 게 좋은 건 아니다.
로그인 정보나 세션, 개인정보처럼 보호해야 할 데이터가 오가는 서비스라면 HTTPS를 사용하는 게 기본이고, 일반적으로는 HTTP 요청을 HTTPS로 전환하는 구성이 더 적절하다.
다만 기존 연계 시스템이나 내부 환경 등의 이유로 일정 기간 HTTP와 HTTPS를 동시에 지원해야 하는 상황은 있을 수 있다.
이번에 궁금했던 것도 바로 그 경우였다.
HTTPS를 추가한다고 기존 HTTP가 자동으로 사라지는 것도 아니고, 반대로 HTTPS 설정 하나만 추가한다고 모든 요청이 안전하게 HTTPS로 전환되는 것도 아니었다.
다음에 비슷한 설정을 볼 때는 Spring Security만 보지 말고 웹서버 → WAS → 애플리케이션 순서로 어디에서 프로토콜을 결정하고 있는지부터 확인해봐야겠다.
'개발 > JavaScript' 카테고리의 다른 글
| async: true로 바꾸면 끝일까? 동기와 비동기 다시 정리하기 (0) | 2026.08.28 |
|---|---|
| Highcharts X축 마지막 연도가 안 보인다... tickPositions 직접 계산하기 (0) | 2026.08.25 |