* 문제
- 개발 반영 했을 때 정상적으로 토큰값을 요청하고 응답 받고 있으나, 운영에 반영시 토큰 값 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 설정 문제이다.
젠자아아앙~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'개발일지 > 네트워크' 카테고리의 다른 글
네트워크/서버 + UnknownHostException 에러 처리 등등..(2/2) 성공적 (0) | 2024.11.22 |
---|---|
curl 통신라이브러리 (0) | 2024.10.29 |