웹 개발2009. 1. 16. 16:16

크로스도메인 문제.
흔히 나오는 예제는 php로 proxy server 만들어 쓰는 겁니다.

php 설치하기 곤란하고, 잘 모를 경우 jsp 개발자를 위해서 간단하게 하는 방법이 있는 것 같아서 올려봅니다.

아파치에 프록시 설치하고 간단한 설정으로 끝난다고 합니다.

mod_proxy 모듈 설치하고

httpd.conf 파일에 다음과 같이 설정하면 됩니다.

ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny, allow
Allow from all
</Proxy>
ProxyPass /exam/jsp ajp://192.168.23.128:8009/examples/jsp
ProxyPassReverse /exam/jsp ajp://192.168.23.128:8009/examples/jsp
<Location /exam/jsp >
Order allow, deny
Allow from all
</Location>
( 참고도서: Professional Apache Tomcat 6, V. Chopra 외 2명, Wrox, 2007 )

이걸로 간단히 내 서버로 request 보내는 것처럼 하면서 다른 서버로 보낼 수 있다니 아파치 대단한 것 같습니다 ^^
Posted by net4all
웹 개발2009. 1. 15. 11:21

Ajax(예. XMLHttpRequest) 를 이용해서 다른 사이트로부터 정보를 가져올 때 다른 도메인일 경우, 보안정책에 걸려 가져올 수 있습니다. 보안을 위해서 소스의 근원이 같을 때만 허용한 다는 동일 근원지 정책(Same origin policy, 이하 SOP)입니다.

간단히 말하면, SOP에 따르면 같은 프로토콜을 이용하고, 같은 서버(호스트)에서 같은 포트를 사용하는 경우만 정보를 주고 받을 수 있습니다.
(링크가 걸려있는 위키에 나와 있는 표를 보면 이해가 쉽습니다. )

어쨌든 이를 해결하기 위한 방법으로는 다음과 같은 방법이 있습니다.

1. 이름 속이기(?)

window.document.domain = 'google.co.kr';

자바스크립트에서 간단하게 도메인 이름만 같은 것처럼 이름을 속여서 가져오는 방법이지만,
여러 곳에서 정보를 가져오거나, 나중에 이름이 바뀌는 경우에는 유지보수의 어려움이 있습니다.

2. JSON with padding

JSON 데이타를 다른 사이트에서 가져오기 특별한 포장지로 감싸는 작업을 하는 겁니다.
XMLHttpRequest로 바로 가져오면 동일 근원지 정책에 위반되기에 자바스크립트 소스인 것처럼 가져오면 이 정책에 위반되지 않고 가져올 수 있습니다.
이에 대한 설명은 Remote JSON이라는 다른 사이트에 올라와있는 글이 있습니다.
http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/
(이를 구현하는 방법에 관한 글은 다른 곳에도 많이 올라와 있을 것으로 생각하므로 여기선 생략하고 넘어갑니다. 필요시에는 간단하게 정리해서 올리겠습니다.)

위 방법으로 이전에 올렸던 JSON 데이타를 자바스크립트 소스인 것처럼 다음과 같이 만들어서 가져오면 됩니다.

callback2([{"symbol":"ee","price":42.0460580763757,"change":0.03570531273294014}])


이전 글의 JSON 데이타에 callback2()라는 함수를 불러오는 것처럼 만듭니다.
함수의 이름을 인자값으로 넘기는 건 다음과 같이 한다고 가정합시다.



이전 글과 달라진 점은 callback이라는 인자를 넘겨서 그 값으로 함수명을 결정도록 한 것 밖에 없습니다.

위와 같이 인자를 바꿔서 자바스크립트 소스처럼 감싸진 결과를 만들려면 이전 소스가 다음과 같이 바뀌면 됩니다.

<%@ page language="java" contentType="text/javascript; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@page import="java.util.Random"%>
<%
final double MAX_PRICE = 100.0; // $100.00
final double MAX_PRICE_CHANGE = 0.02; // +/- 2%
double price;
double change;

Random random = new Random();

StringBuilder body = new StringBuilder();
String output = null;

String q = request.getParameter("q");
String callback = request.getParameter("callback");
%>
<%
 body.append("[");
 if(q != null){
  String[] symbols = q.split(" ");
  
  for(int i=0; i<symbols.length; i++){
   price = random.nextDouble() * MAX_PRICE;
   change = price * MAX_PRICE_CHANGE * (random.nextDouble() * 2.0 - 1.0);
   
   body.append("{" + "");
   body.append("\"symbol\":\"" + symbols[i] +"\"," + "");
   body.append("\"price\":" + price +"," + "");
   body.append("\"change\":" + change +"" + "");
   body.append("}" + "");
   
   if(i < symbols.length - 1)
    body.append("," + "");
  }
 }
 body.append("]" + "");
 
 if(callback != null){
  output = callback + "("+body.toString()+")";
 }else{
  output = body.toString();
 }
 
 out.print(output);
%>



예전 소스에서 크게 달라진 것은 없죠? 함수명을 인자로 받아서 감싸준 부분밖에는요.
이 소스의 예제는 원래 구글 코드에 python으로 만들어졌고, 그 전 소스는 php로 만들어졌는데,
자기 컴퓨터에서는 무엇을 설치해도 상관이 없지만 만약 서버에서 구현할 때 이것저것 설치해야 한다면 문제가 될 수 있으므로
다 JSP 소스로 바꾸기만 한 것입니다.

원 소스 주소는 다음과 같습니다.
http://code.google.com/docreader/#p=google-web-toolkit-doc-1-5&s=google-web-toolkit-doc-1-5&t=GettingStartedJSON





Posted by net4all