반응형
개요
- 프론트 사이트(https)에서 API 서버(http)로 연결하려면 Mixed Content Block 정책으로 인해 연결이 되지 않음
- Selfed Sign SSL을 이용하면 PC에서는 연결이 되지만 모바일에서는 API 호출이 안되는 문제가 발생
- 기존 Nginx를 프록시 서버로 사용해서 https의 요청을 http로 사용했었는데, Selfed Sign SSL문제로 인해 다시 nginx를 제거.
- AWS의 로드밸런서에서 사용중인 SSL 인증서가 있다는 것을 관리자에게 들음
- 따라서 AWS의 로드밸런서를 사용해서 nginx의 역할을 대체하기로함
조치 방법
- http(80)요청이 오면 443으로 리다이렉트
- https(443)요청이 오면 EC2가 포함된 그룹의 리스너로 리다이렉트
- 리스너 규칙은 아래와 같이 API에서 사용중인 스프링부트 서버의 포트로 설정한다. 이렇게 되면 443요청이 올 때 자동적으로 8080포트로 리다이렉트가 된다.
- 추가적으로 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(); }
- 스프링부트의 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
- 이후 헬스 체크를 진행해본다. EC2 SSH로 접속하고 아래 curl을 호출하는데 상태가 UP이면 정상, DOWN이면 문제가 있는 상태이다. 상세한 에러 내역도 나오니까 확인해서 고치자.
curl http://localhost:8080/actuator/health
반응형
'Backend&Devops > AWS' 카테고리의 다른 글
[AWS] EC2 Docker, Docker-compose 설치(Linux) (0) | 2022.03.22 |
---|