IT/Java

CORS / httpUrlConnection 예제

상짱 2020. 2. 3. 17:18
반응형

- ajax 로 타도메인 데이터 받아올 경우, 크로스 도메인 정책으로 크롬에서 block / 익스플로러에서 403 forbiend403 forbidden 이 뜬다. ( 여러현상이 있으나, 기억나는 것만 작성함. )

 

- 응답주는 사이트 운영자에게 크로스 도메인 처리를 해달라고 요청한다.

- 그래도 안되는 경우가 있다. ( 슬슬 올라온다.(열 or 화) )

- 한참을 찾고....

- 한참을 검색하고....

- 한 결과

- 익스플로러 에서는 

[인터넷옵션 > 보안 > 인터넷 > 사용자 지정 수준 ] 을 클릭하고, [도메인 간의 데이터 원본 액세스] 를 선택하면 

데이터가 들어온다.

 

- 크롬에서는 크롬아이콘 오른쪽마우스 속성 

-- disable-web-security

 

- 이렇게 처리하면, 화면단 / 클라이언트단에서는 ajax 호출로 데이터가 들어온다. ( 그래도 데이터가 안오면, 응답주는 사이트 운영자를 족쳐라. )

- but

- [고객님 / 사용자로 부터 이렇게 하세요.] 라고 할 수 없다.

 

- 크로스 도메인 으로 검색을 해서 보면 , 

대부분이 origin 처리 이다.

이 경우는 서버로부터 들어올 경우 해당도메인에 대해서 same origin / 동일자원으로 간주하고 처리된다라는 의미로 해석이 된다.

그렇다면, ajax 호출은 서버를 거쳐서 나가는게 아닌, 클라이언트에서 타도메인서버로 바로 향하는데...

문제점이 있다.

OR

origin 처리시, 타도메인을 등록해두면 요청서버에서 미리 same origin / 동일자원이라고 간주하고 클라이언트에 알려준다고 되어 있다.

 

- 이때까지 내가 검색해보고 검색된 내용 기반으로 내 나름대로 해석된 내용이다.

- 실제적으로 공식사이트 문서 영문을 한글번역해서 써놓은 곳이 대부분이다.

- 그리고 적용소스들이 많은데, 도움되는거 없다. 

 

- 결론,

응답주는 서버에서 크로스 도메인 처리가 되어 있어도, 클라이언트( explorer / chrome .. ) 등에서 보안으로 막는 걸로 확인된다. ( 위에 설정한걸로 데이터 들어오는 것을 보면... )

 

그래서, 서버에서 직접 호출하고 받아온 값을 화면으로 보내는 방식으로 처리해야 한다.

httpclient-4.3.x.jar

httpcore-4.3.x.jar

아파치에서 지원해주는 HttpUrlConnection / HttpClient 을 사용함.

 

- HttpUrlConnection / POST 방식 / json 데이터

public String getData(){
  JsonObject json = new JsonObject();
  json.add("params", "xxx");

  URL url = new URL("http://");
  HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
  httpURLConnection.setRequestMethod("POST");
  httpURLConnection.setDoOutput(true); // post 방식일 경우, true 데이터를 보내야하기 때문
  httpURLConnection.setRequestProperty( "Content-Type", "application/json" );
  httpURLConnection.setRequestProperty( "Accept-Charset", "UTF-8" );
  httpURLConnection.setConnectTimeout(10000);
  httpURLConnection.setReadTimeout(10000);

  OutputStream os = httpURLConnection.getOutputStream();
  os.write( json.toString().getBytes("UTF-8") );
  os.flush();

  BufferedReader in = new BufferedReader(new InputStreamReader( httpURLConnection.getInputStream(), "UTF-8"));
  String resultDataString = "";
  String intpuList = "";
  while( (intpuList = in.readLine()) != null ) {
      resultDataString += intpuList;
  }
  System.out.println( resultDataString );

  httpURLConnection.disconnect();
  
  return resultDataString;
}

 

- HttpUrlConnection / POST 방식 / input / session 유지

// session 셋팅
public CookieStore getCooke(){
  Map<String,Object> params = new LinkedHashMap<>(); // 파라미터 세팅
  params.put( "ssoKey", ssoKey );

  StringBuilder postData = new StringBuilder();
  for(Map.Entry<String,Object> param : params.entrySet()) {
    if(postData.length() != 0) postData.append('&');
    postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
    postData.append('=');
    postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
  }
  byte[] postDataBytes = postData.toString().getBytes("UTF-8");

  URL url = new URL("http://");
  HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
  httpURLConnection.setRequestMethod("POST");
  httpURLConnection.setDoOutput(true); // post 방식일 경우, true 데이터를 보내야하기 때문

  OutputStream os = httpURLConnection.getOutputStream();
  os.write( postDataBytes );
  os.flush();

  CookieManager cm = new CookieManager(null, CookiePolicy.ACCEPT_ALL);
  CookieHandler.setDefault( cm );
  cm.put(url.toURI(), httpURLConnection.getHeaderFields());

  httpURLConnection.disconnect();

  return cm.getCookieStore();
}

// session 이 필요한 url
public String otherUrl(){
  URL url = new URL("http://");
  HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
  httpURLConnection.setRequestMethod("POST");

  CookieStore cookieStore = getCooke();
  List<HttpCookie> cookies = cookieStore.getCookies();
  for (HttpCookie cookie : cookies) {
    System.out.println( "2 : " + cookie);
    httpURLConnection.setRequestProperty( "cookie", cookie.toString() );
  }
  ...
}
        

 

반응형