Error & 해결방법

java.net.SocketTimeoutException: Read timed out 오류

Dev.Congsik 2025. 1. 2. 17:28
728x90

최초 로그 (15:31:24)

  • 발생 시간: 2024-12-19 15:31:24.044
  • 로그 레벨: ERROR
  • 원인:
    • ResourceAccessException 발생.
    • I/O error 발생: GET 요청에서 Read timed out.
    • java.net.SocketTimeoutException: Read timed out: 요청에 대한 응답이 일정 시간 내에 오지 않아 연결이 끊어졌음.

원인

  • 애플리케이션이 인증 서버에 GET 요청을 보냈으나, 인증 서버의 응답을 기다리는 동안 타임아웃이 발생했습니다. 이 경우, 네트워크 지연, 서버 과부하, 또는 타임아웃 설정이 너무 짧은 경우가 원인일 수 있습니다.

문제 분석 및 원인

1. 토큰 만료 문제 (OAuth2Exception)

  • 만료된 토큰 사용: 클라이언트가 만료된 OAuth2 토큰으로 인증을 시도하면서 invalid_token 오류가 발생한 것입니다.
  • 토큰 갱신 실패: 클라이언트가 만료된 토큰을 갱신하는 과정에서 문제가 발생했을 가능성. 일반적으로 refresh_token을 이용하여 새 액세스 토큰을 발급받을 수 있습니다.

2. 응답 시간 초과 (SocketTimeoutException)

  • 네트워크 지연: 인증 서버와의 통신에서 네트워크 지연이 발생했을 수 있습니다. 이는 네트워크 상태가 불안정하거나, 인증 서버와의 연결이 원활하지 않아서 발생할 수 있습니다.
  • 서버 과부하: 인증 서버가 과부하 상태이거나, 처리할 수 있는 요청량이 초과되어 응답 시간이 길어졌을 수 있습니다.
  • 타임아웃 설정: 애플리케이션의 HTTP 클라이언트에서 타임아웃 설정이 너무 짧을 수 있습니다. 요청이 응답을 기다리는 시간이 너무 적으면, 네트워크 지연 또는 서버 부하로 인해 타임아웃이 발생할 수 있습니다.

해결 방안

1. 토큰 만료 문제 해결

  • 토큰 갱신 처리 확인:
    • OAuth2 인증 흐름에서 refresh_token을 사용하여 새 액세스 토큰을 발급받는 로직이 정상적으로 작동하는지 확인.
    • 토큰 만료 시 자동으로 새로운 토큰을 발급받을 수 있도록 로직을 강화.
  • 오류 처리 로직 개선:
    • invalid_token 오류가 발생하면, 클라이언트가 자동으로 refresh_token을 사용하여 새로운 액세스 토큰을 요청하도록 로직을 개선.
  • 서버 로그 확인:
    • 인증 서버에서 관련 로그를 확인하여 토큰 만료 및 갱신 실패 원인 파악.

2. 응답 시간 초과 문제 해결

  • HTTP 클라이언트 타임아웃 설정 조정:
    • Spring의 RestTemplate 또는 HTTP 클라이언트에서 타임아웃 설정을 늘려줍니다. 예를 들어, connectTimeout과 readTimeout 값을 늘려서 응답을 더 오래 기다리도록 설정할 수 있습니다.
      HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); 
      factory.setConnectTimeout(5000); // 연결 타임아웃 5초 
      factory.setReadTimeout(10000); // 응답 대기 타임아웃 10초 
      RestTemplate restTemplate = new RestTemplate(factory);
  • 네트워크 및 서버 부하 점검:
    • 서버와 인증 서버 간의 네트워크 상태를 점검하고, 네트워크 지연이 발생하지 않도록 조치를 취합니다.
    • 인증 서버의 부하 상태를 모니터링하여 응답 속도를 개선할 수 있도록 부하 분산을 고려합니다.
  • 재시도 로직 추가:
    • 서버가 일시적으로 응답하지 않거나 시간이 초과되는 경우, 재시도 로직을 추가하여 자동으로 요청을 재시도하도록 처리합니다.
RetryTemplate retryTemplate = new RetryTemplate(); 
retryTemplate.execute(context -> { return restTemplate.getForObject("인증서버주소", String.class); });

3. 인증 서버 상태 점검

  • 서버 상태 확인:
    • 인증 서버의 성능 및 부하 상태를 점검하고, 필요 시 로드 밸런싱을 통해 요청을 분산합니다.
    • 서버 로그 및 모니터링 도구를 사용하여 응답 지연 문제를 추적합니다.
728x90