본문 바로가기
Cloud 개발

Apache와 Spring Boot에서 HTTPS 리다이렉트 문제 해결 방법 - 소셜 로그인 삼성인터넷 호환성

by 굿대디~ 2025. 7. 29.
반응형

Apache 서버를 HTTPS 프론트엔드로 사용하고 Spring Boot를 HTTP 백엔드로 구성할 때 발생하는 리다이렉트 프로토콜 변경 문제는 많은 개발자들이 경험하는 일반적인 이슈예요. 특히 소셜 로그인 기능과 함께 사용할 때 더욱 복잡해지는데, 이런 문제들을 단계별로 해결해보도록 할게요.

 

Apache와 Spring Boot 프록시 환경에서 HTTPS 리다이렉트 문제 해결 방법을 보여주는 시스템 구성도

문제 발생 원인 분석

프록시 환경에서의 프로토콜 인식 문제

Apache 리버스 프록시 뒤에 있는 Spring Boot 애플리케이션은 클라이언트로부터 HTTPS 요청을 받더라도 내부적으로는 HTTP로 처리돼요. 이때 Spring Boot는 자신이 HTTP 환경에서 실행되고 있다고 인식하여 리다이렉트 URL을 생성할 때 HTTP 프로토콜을 사용하게 됩니다.

삼성인터넷 브라우저의 특수성

삼성인터넷 브라우저는 보안상의 이유로 HTTP/HTTPS 스키마에 대한 리다이렉션을 기본적으로 차단하는 보안 정책을 가지고 있어요. 이로 인해 소셜 로그인 과정에서 프로토콜이 변경될 때 로그인 실패가 발생할 수 있습니다.

HTTP/HTTPS flow in proxy

Spring Boot 설정을 통한 해결 방법

1. Forward Headers Strategy 설정

application.properties에 다음 설정을 추가해서 프록시에서 전달되는 헤더 정보를 올바르게 처리하도록 해주세요:

server.forward-headers-strategy=framework
server.tomcat.remoteip.internal-proxies=\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}

이 설정을 통해 Spring Boot는 X-Forwarded-Proto, X-Forwarded-Host 등의 헤더를 인식하여 원본 프로토콜 정보를 파악할 수 있어요.

2. RemoteIpValve 설정 추가

더 구체적인 제어가 필요한 경우, 다음과 같이 Configuration 클래스를 작성해주세요:

@Configuration
public class ProxyConfig {
    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addEngineValves(new RemoteIpValve());
        return tomcat;
    }
}

 

Apache 설정 최적화

1. 프록시 헤더 설정

Apache 가상 호스트 설정에서 프록시 관련 헤더들을 올바르게 전달하도록 설정해주세요:

    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/

    ProxyPassReverse / https://yourdomain.com/
    ProxyPassReverseMapping / https://yourdomain.com/

    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-Port "443"

2. 추가 헤더 설정

더 완전한 프록시 환경을 위해 다음 헤더들도 추가로 설정하는 것이 좋아요:

RequestHeader set X-Forwarded-For %h
RequestHeader set X-Real-IP %h
RequestHeader set Host %{HTTP_HOST}s

[이미지 삽입 - "Apache 프록시 설정 구성도" -]

관련 사이트:

소셜 로그인 특화 설정

1. OAuth2 클라이언트 설정

application.yml에서 소셜 로그인 redirect URI를 명시적으로 HTTPS로 설정해주세요:

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            redirect-uri: "https://{baseHost}{basePort}/login/oauth2/code/{registrationId}"
          kakao:
            redirect-uri: "https://{baseHost}{basePort}/login/oauth2/code/{registrationId}"

2. 보안 설정 강화

Security Configuration에서 HTTPS 강제 설정을 추가해보세요:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .requiresChannel(channel -> 
            channel.requestMatchers(r -> r.getHeader("X-Forwarded-Proto") != null)
                   .requiresSecure())
        .oauth2Login();
}

3. BaseUrl 강제 설정

Spring Boot에서 명시적으로 Base URL을 HTTPS로 고정하는 방법도 있어요:

@Bean
public ForwardedHeaderFilter forwardedHeaderFilter() {
    return new ForwardedHeaderFilter();
}

@Value("${app.base-url:https://yourdomain.com}")
private String baseUrl;

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.oauth2Login(oauth2 -> 
        oauth2.authorizationEndpoint(authorization -> 
            authorization.baseUri(baseUrl + "/oauth2/authorization")));
    return http.build();
}

 

관련 사이트:

브라우저별 호환성 대응

삼성인터넷 브라우저 대응

삼성인터넷 브라우저의 보안 정책을 고려하여 다음 사항들을 점검해주세요:

1. 일관된 프로토콜 사용
전체 로그인 플로우에서 HTTPS를 일관되게 사용하도록 설정해요:

server.use-forward-headers=true
server.servlet.session.cookie.secure=true
server.servlet.session.cookie.same-site=lax

2. 리다이렉트 체인 최소화
불필요한 중간 리다이렉트를 제거하고 직접적인 경로를 사용해주세요:

@GetMapping("/login/success")
public String loginSuccess(HttpServletRequest request) {
    String scheme = request.getHeader("X-Forwarded-Proto");
    if (scheme == null) {
        scheme = request.getScheme();
    }

    if (!"https".equals(scheme)) {
        return "redirect:https://" + request.getServerName() + "/dashboard";
    }

    return "redirect:/dashboard";
}

크로스 브라우저 테스트

다양한 브라우저에서의 동작을 확인하기 위해 체계적인 테스트를 진행해보세요:

  • Chrome/Edge (Chromium 기반): 개발자 도구로 네트워크 흐름 분석
  • Firefox: about:config에서 security.tls 관련 설정 확인
  • Safari (iOS/macOS): Intelligent Tracking Prevention 설정 고려
  • 삼성인터넷: 스마트 안티추적 기능 비활성화 테스트
  • 네이버 앱 내장 브라우저: User-Agent 헤더 확인

 

문제 해결 검증 방법

1. 개발자 도구 활용

브라우저 개발자 도구의 Network 탭에서 다음 사항들을 확인해보세요:

  • 리다이렉트 응답의 Location 헤더https://로 시작하는지
  • X-Forwarded 헤더들이 올바르게 전달되는지
  • 소셜 로그인 콜백 URL이 정확한지
  • 쿠키의 Secure 플래그가 설정되어 있는지

2. 로그 분석

Spring Boot 애플리케이션에서 상세한 디버그 정보를 확인하기 위한 로그 설정이에요:

logging.level.org.springframework.security=DEBUG
logging.level.org.springframework.web=DEBUG
logging.level.org.apache.catalina.valves.RemoteIpValve=DEBUG

3. curl을 통한 테스트

서버 레벨에서의 동작을 확인하기 위해 다음 명령어로 테스트해보세요:

curl -v -H "X-Forwarded-Proto: https" \
     -H "X-Forwarded-Port: 443" \
     -H "X-Forwarded-Host: yourdomain.com" \
     -H "X-Forwarded-For: 192.168.1.100" \
     http://localhost:8080/your-endpoint

관련 사이트:

성능 및 보안 고려사항

SSL/TLS 최적화

Apache에서 SSL 처리를 담당하므로 다음 설정들을 통해 성능과 보안을 동시에 향상시킬 수 있어요:

# 현대적인 TLS 프로토콜만 사용
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE+AESGCM:ECDHE+AES256:ECDHE+AES128:!aNULL:!MD5:!DSS
SSLHonorCipherOrder on

# HSTS 헤더 추가
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

# SSL 세션 캐시 최적화
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300

보안 헤더 추가

추가적인 보안을 위해 다음 헤더들을 설정해주세요:

Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options DENY
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"

로드 밸런싱 고려사항

여러 Spring Boot 인스턴스를 사용하는 경우 세션 관리를 위한 설정이 필요해요:

# Redis를 활용한 세션 클러스터링
spring.session.store-type=redis
spring.redis.host=localhost
spring.redis.port=6379

# 또는 sticky session 설정
server.servlet.session.cookie.same-site=strict

트러블슈팅 체크리스트

문제가 지속될 경우 다음 항목들을 순서대로 확인해보세요:

1단계: 기본 설정 확인

  • server.forward-headers-strategy=framework 설정 확인
  • Apache 프록시 헤더 설정 확인
  • SSL 인증서 유효성 확인

2단계: 프록시 헤더 검증

  • X-Forwarded-Proto 헤더가 'https'로 전달되는지 확인
  • X-Forwarded-Host 헤더가 올바른 도메인으로 설정되는지 확인
  • ProxyPreserveHost가 On으로 설정되어 있는지 확인

3단계: 소셜 로그인 설정 검증

  • OAuth2 클라이언트 등록 정보의 redirect URI가 HTTPS인지 확인
  • 각 소셜 플랫폼의 개발자 콘솔에서 도메인 설정 확인
  • CORS 설정이 올바른지 확인

4단계: 브라우저별 테스트

  • 시크릿/프라이빗 모드에서 테스트
  • 쿠키 및 캐시 완전 삭제 후 재테스트
  • 다른 네트워크 환경에서 테스트

 

관련 사이트:

마무리

Apache와 Spring Boot를 함께 사용하는 프록시 환경에서 HTTPS 리다이렉트 문제를 해결하는 것은 여러 계층에서의 설정이 조화롭게 작동해야 하는 복합적인 작업이에요. 특히 소셜 로그인과 삼성인터넷 브라우저 호환성까지 고려한다면 더욱 세심한 접근이 필요합니다.

핵심은 Forward Headers Strategy 설정, Apache 프록시 헤더 전달, OAuth2 리다이렉트 URI 명시적 설정이 삼박자를 이뤄야 한다는 점이에요. 이 세 가지가 제대로 설정되면 대부분의 프로토콜 변경 문제가 해결될 거예요.

문제가 지속된다면 단계별 체크리스트를 따라 하나씩 검증해보시고, 필요시 브라우저 개발자 도구와 서버 로그를 적극 활용해서 정확한 원인을 파악해보세요. 이런 경험들이 쌓이면 나중에는 더 안정적이고 효율적인 시스템 구성이 가능할 거예요.

 

 

함께 보기 좋은 추천 글

 

2025년 서울 및 해외 주요 AI 및 IT 관련 행사 일정 총정리!

2025년에 서울에서 진행되는 다양한 행사 일정과 더불어 해외 주요 AI 및 IT관련 행사 일정을 알려드릴게요. 전 4월에 월드 IT 쇼 2025 신청 했어요.아직 사진 신청기간(25년 4월23일까지)이라 무료로

softone.tistory.com

 

서울 문화 공연 행사 : 2025년 진행되는 콘서트 음악 연극 전시 예술 총정리!

✨ 올 한해 서울에서 펼쳐질 4월부터 7월까지 놓치면 후회할 공연 & 행사 총정리! ✨안녕하세요! 2025년 봄과 여름을 화려하게 수놓을 서울의 다양한 문화 행사와 공연 정보를 총정리해 보았어요.

softone.tistory.com

 

챗GPT 할인 계정 공유 사이트 비교: GamsGo, GoingBus, 그리고 NFXBUS 프로모션

챗GPT의 폭발적인 인기와 함께 많은 사용자들이 이 강력한 AI 도구의 고급 기능을 활용하고자 하지만, OpenAI의 유료 구독 모델인 ChatGPT Plus는 기본 20$로 월 비용이 부담스러울 수 있어, 비용을 절감

softone.tistory.com

 

2025년 5월 최신 소상공인 지원정책 총정리 - 한눈에 보는 혜택과 신청방법

소상공인 여러분! 2025년 5월 현재 이용 가능한 다양한 소상공인 지원정책을 한눈에 파악하실 수 있도록 정리해 드릴게요. 정부는 올해 역대 최대 규모인 5.9조원의 예산을 소상공인 지원에 책정

softone.tistory.com

 

서버+오라클DB 평생 무료 사용기 (feat. 무료 클라우드 계정)

저는 현재 오라클 무료 계정을 이용하여 테스트 서버 및 오라클DB와 파일서버, 자체 메일서버 등의 서비스를 3년 넘게 무료로 사용하고 있습니다. AWS나 구글 GCP로 해당 계정의 서버들을 켜놓기만

softone.tistory.com

반응형