Backend&Devops/AWS

[AWS] 로드밸런서의 SSL를 EC2 스프링부트와 연동하기

기은P 2024. 12. 20. 09:15
반응형

개요

  • 프론트 사이트(https)에서 API 서버(http)로 연결하려면 Mixed Content Block 정책으로 인해 연결이 되지 않음
  • Selfed Sign SSL을 이용하면 PC에서는 연결이 되지만 모바일에서는 API 호출이 안되는 문제가 발생
  1. 기존 Nginx를 프록시 서버로 사용해서 https의 요청을 http로 사용했었는데, Selfed Sign SSL문제로 인해 다시 nginx를 제거.
  2. AWS의 로드밸런서에서 사용중인 SSL 인증서가 있다는 것을 관리자에게 들음
  3. 따라서 AWS의 로드밸런서를 사용해서 nginx의 역할을 대체하기로함

 

조치 방법

  1. http(80)요청이 오면 443으로 리다이렉트
  2. https(443)요청이 오면 EC2가 포함된 그룹의 리스너로 리다이렉트
  3. 리스너 규칙은 아래와 같이 API에서 사용중인 스프링부트 서버의 포트로 설정한다. 이렇게 되면 443요청이 올 때 자동적으로 8080포트로 리다이렉트가 된다.
  4. 추가적으로 AWS 로드밸런서에서 주기적으로 헬스체크를 하기 때문에 해당 경로의 화이트리스트 추가가 필요하다.
    내 경우에는 스프링의 화이트리스트에 “/actuator/health/**”를 추가하고, AWS 리스너 규칙의 상태검사의 경로를 똑같이 지정해주었다.
    private static final String[] AUTH_WHITELIST = {
                "/barocert/**","/api/**", "/swagger-ui/**", "/swagger-ui.html",
                "/actuator/health/**"
        };
    
    
        @Bean
        public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
            //CSRF, CORS
            httpSecurity.csrf((csrf) -> csrf.disable());
            httpSecurity.cors(Customizer.withDefaults());
    
            //세션 관리 상태 없음으로 구성, Spring Security가 세션 생성 or 사용 X
            httpSecurity.sessionManagement(sessionManagement -> sessionManagement.sessionCreationPolicy(
                    SessionCreationPolicy.STATELESS));
    
            //FormLogin, BasicHttp 비활성화
            httpSecurity.formLogin((form) -> form.disable());
            httpSecurity.httpBasic(AbstractHttpConfigurer::disable);
    
    
            //JwtAuthFilter를 UsernamePasswordAuthenticationFilter 앞에 추가
    //        httpSecurity.addFilterBefore(new JwtRequestFilter(adminService), UsernamePasswordAuthenticationFilter.class);
    
            // 권한 규칙 작성
            httpSecurity.authorizeHttpRequests(authorize -> authorize
                    .requestMatchers(AUTH_WHITELIST).permitAll()
                    //@PreAuthrization을 사용할 것이기 때문에 모든 경로에 대한 인증처리는 Pass
                    //.anyRequest().permitAll()
                    .anyRequest().authenticated()
            );
    
            return httpSecurity.build();
        }
  5. 스프링부트의 application.properties에 부가적인 설정을 추가해준다
    # 서버가 요청의 헤더(예: X-Forwarded-For, X-Forwarded-Proto 등)를 처리하는 방식 설정
    # "native"로 설정하면, 애플리케이션이 프록시 서버(예: Nginx, AWS ELB)의 헤더를 신뢰하여 처리
    server.forward-headers-strategy=native
    
    # Spring Boot Actuator에서 노출할 웹 엔드포인트를 설정
    # "health"로 설정하면 /actuator/health 엔드포인트만 노출
    management.endpoints.web.exposure.include=health
    
    # /actuator/health 엔드포인트에서 상태의 세부 정보를 항상 포함하도록 설정
    # 이 설정은 상태 확인 시 모든 세부 정보를 반환하도록 함 (예: 디스크 상태, DB 상태 등)
    management.endpoint.health.show-details=always
    
    # Spring Boot Actuator의 health 상태 확인에서 DB 상태 체크를 비활성화
    # DB 연결 실패 여부에 상관없이 /actuator/health 응답에서 DB 상태를 제외
    management.health.db.enabled=false
    
    # Spring Boot Actuator와 관련된 로깅 레벨을 DEBUG로 설정
    # Actuator 관련 디버깅 정보를 로그에 출력하여 문제를 분석하거나 동작을 확인할 수 있도록 설정
    logging.level.org.springframework.boot.actuate=DEBUG


  6. 이후 헬스 체크를 진행해본다. EC2 SSH로 접속하고 아래 curl을 호출하는데 상태가 UP이면 정상, DOWN이면 문제가 있는 상태이다. 상세한 에러 내역도 나오니까 확인해서 고치자.
curl http://localhost:8080/actuator/health

 

 

 

반응형