HTTP URL 와 HTTPS URL 의 사이의 리다이렉트(redirect)가 추적되지 않는다 - xrath.com 에서 번역됨

> ## HTTP URL 와 HTTPS URL 의 사이의 리다이렉트(redirect)를 하지 않는다

> ### 증상

> > 애플릿을 Sun JRE 를 사용한 브라우저로 실행하고 있는 경우, HTTP URL 에 리다이렉트(redirect) 하는 서버에 대해서 애플릿이 HTTP 요구를 실시하면, 리다이렉트(redirect)에 실패합니다. 또, HTTP URL 에 리다이렉트(redirect) 하는 서버에 대해서 HTTPS 요구를 실시하는 경우도 실패한다. 같은 애플릿이 Microsoft VM 에서는 에러없이 실행할 수 있습니다.

> ### 원인

> > Sun JRE 에 구현된 HTTP/HTTPS 리다이렉트(redirect) 정책가 원인입니다. 시큐리티상 심각한 결과를 부를 우려가 있기 (위해)때문에, HTTP 와 HTTPS 의 사이의 리다이렉트(redirect)는 자동적으로 행해지지 않습니다.

> > Microsoft VM 에서는, 리다이렉트(redirect)에 대한 동의를 시큐리티의 경고 다이얼로그로 사용자에게 요구합니다. 사용자가 동의 했을 경우만, 리다이렉트(redirect)를 합니다.

> ### 해결 방법

> > 문제를 회피하려면 , 어플리케이션으로, 응답 코드를 체크해 리다이렉트(redirect)인 것을 식별하지 않으면 안됩니다. Location 헤더 필드치는 리다이렉트(redirect) 정보로서 체크 가능하기 때문에, 어플리케이션은 새로운 프로토콜을 사용해 리다이렉트(redirect)를 실시할지 어떨지를 결정할 필요가 있습니다. 다음에 예를 나타냅니다.

> > > `public void makeConnection(URL url)
> > > {
> > > URLConnection conn = url.openConnection();
> > > InputStream is = conn.getInputStream();
> > > ....
> > > is.close();
> > > }`

> > 이 코드를 다음과 같이 변경합니다.

> > > `private InputStream openConnectionCheckRedirects(URLConnection c) throws IOException
> > > {`
> > > `boolean redir;
> > > int redirects = 0;
> > > InputStream in = null;
> > > ``do
> > > {
> > > if (c instanceof HttpURLConnection)``
> > > {
> > > ((HttpURLConnection) c). setInstanceFollowRedirects(false);
> > > }
> > > ``// We want to open the input stream before getting headers
> > > // because getHeaderField() et al swallow IOExceptions.
> > > in = c.getInputStream();
> > > redir = false;
> > > if (c instanceof HttpURLConnection)
> > > {
> > > HttpURLConnection http = (HttpURLConnection) c;
> > > int stat = http.getResponseCode();
> > > if (stat >= 300 && stat <= 307 && stat ! = 306 &&
> > > stat ! = HttpURLConnection.HTTP_NOT_MODIFIED)
> > > {
> > > URL base = http.getURL();
> > > String loc = http.getHeaderField("Location");
> > > URL target = null;
> > > if (loc ! = null)
> > > {
> > > target = new URL(base, loc);
> > > }
> > > http.disconnect();
> > > ` `// Redirection should be allowed only for HTTP and HTTPS
> > > // and should be limited to 5 redirections at most.
> > > if (target == null || ! (target.getProtocol(). equals("http")
> > > || target.getProtocol(). equals("https"))
> > > || redirects >= 5)
> > > {`
> > > `throw new SecurityException("illegal URL redirect");
> > > }`
> > > `redir = true;
> > > c = target.openConnection();
> > > redirects++;
> > > }
> > > }
> > > }
> > > while (redir);
> > > return in;
> > > }`

> > > `public void makeConnection(URL url){
> > > URLConnection conn = url.openConnection();
> > > InputStream is = openConnectionCheckRedirects(conn);
> > > ....
> > > is.close();
> > > }`

> ### 상세 정보

> > 없음