본문 바로가기

개발일지/네트워크

네트워크/서버 + UnknownHostException 에러 처리 등등..(1/2)

 

* 문제

- 개발 반영 했을 때 정상적으로 토큰값을 요청하고 응답 받고 있으나, 운영에 반영시 토큰 값 null로 들어오는 현상

 

* 에러 요약

 

- 보안관제센터를 통해 출발지(우리 IP) -> 목적지(API의 IP)의 방화벽 및 네트워크 정책 수정 요청 (포트번호 필요)

- 정상적으로 패킷 요청을 하는지 확인 

 

 


1. nslookup 도메인

- 입력 했을 때 입력한 도메인에 대한 ip 반환

 

2. ping 패킷 100손실

네트워크 연결 상태 확인 (100% 손실!! 띠용)

 

3. 서버 shell에서 curl 명령어를 이용해 토큰값 요청시 정상적으로 들어옴 (???)

 

curl --location "패킷 요청할 주소값" \
     --header "Authorization: Basic 암호화" \
     --form "grant_type=client_credentials"
  • curl : HTTP 요청을 수행하기 위한 명령어
  • --location : 요청이 리디렉션(HTTP 3xx 응답 코드)을 받을 경우, 자동으로 리디렉션된 URL로 요청을 계속 수행합니다.
  • "패킷 요청할 주소값" 부분 : 요청을 보낼 서버의 URL입니다. 예를 들어, 토큰 발급을 처리하는 OAuth 2.0 토큰 엔드포인트 URL일 가능성이 높습니다.
  • --header "Authorization: Basic 암호화" : Authorization(허가) / Basic 암호화는 Base64로 인코딩된 문자열이며, 일반적으로 client_id:client_secret 형태를 인코딩한 값입니다. 이 헤더는 클라이언트의 신원을 서버에 인증하기 위해 사용됩니다.

==> 요약 : 패킷 주고 받는 명령어인데, 암호화 부분은 API 업체에서 부여 받아야 됨 

==> 부여 받은 암호화와 주소를 가지고 요청 전문(패킷)을 날리면 응답을 받을 수 있다.

==> 그 응답 값이 토큰 값이 들어 있음 

 


* 에러요약 2

 

- 운영서버 shell에서 curl 명령어를 날렸을 땐 패킷을 정상적으로 가지고 오는 상황

- 보안관제센터에 연락해서 목적지와 출발지로 패킷이 날아가는지 확인 -> 확인됨

=> 그러나 여기서 문제는 운영서버에 반영 후 > 사이트에서 API 통신 요청을 전혀 찾을 수 없음

=> 그렇다는 건..~~~ 서버 문제는 아니고, JAVA단에서 통신 실패가 일어난다는 것

 


 

* 개발서버 반영시 정상적으로 돌아가는 상황이니까 확인해봐야 하는 부분

-> ID/PW, 인증키, URL 등이 있는 WEB.xml 운영용으로 교체

-> 패킷 전송할 주소 및 Cert SDK 확인 (script)

-> 요청값 만들어서 통신하는 메소드 부분 

==> 셋 다 API 업체 통해서 받은 소스 라서 틀릴리가 없음

 

 

 

> 178~181까지 선언한 값들의 결과는 정상

> TLS 버전 설정의 경우 :

 - API 업체의 운영서버는 TLS 버전 1.2, 자바 1.7에서는 Default 값으로 버전 1.0 사용

 - 버전 설정 맞지 않는 경우 sslhandshakeexception로 떨어지기 때문에 

 - HttpURLConnection 하기 전에 184 라인 추가 

 

 

위 로그의 catch 부분

API 업체 담당자분께서 여기까지만 봐서는 알 수 없어 Exception 부분에 e.printStackTrace(); 를 통한 자세한 오류 수집을 원하심


 

catch  수정버전 

실제 오픈시에는 e.printStackTrace() 숨겨야 됨

 

 

catch문 작성시 :

- log 출력용은 하나로 고정하는 게 좋다고 해서 API업체에서 준 메소드 이용함

- 스택트레이스 상세기록 할 때 String 대신 StringWriter() 사용해야 하는 이유

  +=, \n 이런 거 안 넣어도 된다고오~~~

 

 

- String / StringWriter 차이는 아래

(출처 : 쨋쥐피티)

변경 가능 여부 불가능 (불변) 가능 (내부적으로 StringBuffer 사용)
사용 목적 문자열 데이터 저장 및 읽기 문자열 데이터 동적 생성 및 수정
성능 문자열 수정 시 느림 문자열 수정 시 빠름
예외 스택 트레이스 직접 처리해야 함 PrintWriter와 쉽게 통합 가능
  • StringWriter는 문자열을 동적으로 생성하거나 수정해야 할 때 적합합니다.
  • String은 간단히 문자열을 저장하거나 조작이 필요 없는 경우 사용합니다.
  • 예외 스택 트레이스 같은 상황에서는 StringWriter가 더 직관적이고 효율적입니다.
  •  

여기까지 작성 후 요청값 날렸을 때

- Exception 에러로 빠지면서 아래 log 출력

- UnknownHostException : Java 네트워크 라이브러리가 지정된 호스트 이름(도메인)을 IP 주소로 변환하지 못 함 

java.net.UnknownHostException: api.test.co.kr
심각: exception : api.test.co.kr
심각: exception URL : https://api.test.co.kr/oauth/token
심각: grantTypeValue : grant_type=client_credentials
심각: exception trace : java.net.UnknownHostException: api.test.co.kr
정보: call url : https://api.test.co.kr/oauth/token (-1))
심각: Fail get OAuth Access_token!

 

 

UnknownHostException 에러가 나고 있어

다른 예외처리 앞에 아래 코드 추가해서 확인

정확히 IP 주소 변환 도중 에러가 남

 

그러나 맨 위에서 시도 했던 것처럼 운영서버에 nslookup 테스트 했을 때 정상적으로 IP 변환이 이뤄지고 있기 때문에 서버 자체의 문제는 아니고, 해당 프로젝트 또는 DNS 설정 문제이다.

 

 

젠자아아앙~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~