JAVA를 통한 HttpsURLConnection 연결

김재민·2022년 3월 8일
0

HttpsURLConnection이란?

JAVA 소스 내에서 SSL 적용된 사이트에 접근하기 위해, REST Api를 호출하기 위해 사용,
결과 데이터를 스트림 형식으로 제공받아 이용이 가능

데이터 타입이나 길이는 거의 제한이 없음, 주로 미리 길이를 알지못하는 스트림 데이터를 주고받는데 사용

public abstract class HttpURLConnection extends HttpURLConnection

Fields inherited from class java.net.URLConnection
allowUserInteraction, connected, doInput, doOutput, ifModifiedSince, url, useCaches
  • HttpURLConnection을 상속받고 있는 것을 볼 수 있음(URLConnection은 주로 URL 내용을 읽어오거나, URL 주소에 GET/POST로 데이터를 전달할 때 사용)
  • URLConnection은 리소스에 연결하기전에 구성되어야 함
  • URLConnection 인스턴스는 재사용될 수 없음, 각 리소스에 대한 커넥션마다 다른 인스턴스를 사용해야함

URLConneciton 관련 필드 및 메소드

getAllowUserInteraction() : 연결된 곳에 사용자가 서버와 통신할 수 있는 환경여부를 확인(boolean),
			   input/output이 해당서버, 연결포트로 가능한지 확인
getDefaultAllowUserInteraction(): 기본적으로 User와 통신가능한 상태인지 확인
connect() : 해당 url에 연결된 곳에 접속할 때 사용. false인 경우, 연결객체는 지정된 URL로 통신링크 
	    작성하고 true인 경우에 통신링크가 설정되어 있음
setDoInput : URLConnection에 대한 doInput 필드값을 지정된 값으로 설정, URL 연결은 입출력에 사용될 수 있음
             true로 설정시 서버통신에서 입력 가능한 상태로 설정(응답 헤더와 메시지 등을 Read)
setDoOutput() : URLConnection에 대한 doOutput 필드값을 지정된 값으로 설정 
                true로 설정시 서버통신에서 출력 가능한 상태로 설정(outputstream으로 데이터 처리 등) (default : false) 
getDoInput() : Server에서 온 데이터를 입력 받을 수 있는 상태인지 여부를 확인(default : true)
getDoOutput(): Server에서 온 데이터를 출력 할수 있는 상태인지 여부를 확인(default : false) 
ifModifiedSince : 일부 프로토콜은 개체가 특정 시간보다 더 최근에 수정되지 않은 경우 개체 가져 오기 건너 뛰기를 지원, 
                  0이 아닌 값은 GMT 1970 년 1 월 1 일 이후의 밀리 초 수로 시간을 제공(default : 0)
useCaches : true프로토콜은 가능할 때마다 캐싱을 사용할 수 있다. 즉 이전에 다운로드 받은 데이터를 사용할지에대한 여부
             DefaultUseCaches에서 가져 오며 기본값은 true이다.

예제

HttpsURLConnection 사용시 발생하는 문제

오류메세지 : SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed

2) 오류 발생 상황

  • SSL 인증서가 신뢰하는 기관 인증서가 없거나 SSL/TLS암호화 버전이 맞지 않는 경우 발생
  • 연결하려는 서버의 인증서가 신뢰하는 인증기관 인증서 목록(keystore)에 없을 경우 - 사설 인증서일 경우.
  • 서버/클라이언트 사이에 사용하려는 TLS 버전이 맞지 않을 때(TLS 1.0 만 지원하는 서버에 1.2로 hand shaking 요청등)
  • TLS 통신에 사용하려는 cipher suite 가 오래되거나 지원하지 않음. (JDK 1.8 부터는 sha1 지원 안되고 sha256 이상을 사용해야 한다고 한다.)

3) 해결법

3.3) 아무 작업도 하지 않는 TrustManager를 설치하여 우회 하는 방법

  • 사실 많은 구글링을 통해 위와 같은 대안을 제시하는경우를 많이 보았다. 물론 나도 위와 같이 처리하여 임시로 인증서 오류를 우회하여 처리하기도 하였다.

  • 이와 같이 처리하는 경우 보안 이슈도 있으며, 앱의 경우 배포 리젝도 발생할 수 있으니 조심 하도록 하자. 사용하는 방법은 매우 간단하다.

  • 다음 내용을 추가해주면 된다.

profile
어제의 나보다 나은 오늘의 내가 되자!🧗‍♂️

0개의 댓글