참조: http://www.ibm.com/developerworks/kr/webservices/library/ws-sec1.html
참조: http://www.java-tips.org/other-api-tips/httpclient/how-to-use-basic-authentication.html
참조: http://docstore.mik.ua/orelly/java-ent/servlet/ch08_01.htm
참조: http://www.javaworld.com/javaworld/javatips/jw-javatip47.html
HTTP를 이용한 웹 서비스 보안
* HTTP 기본 권한
* HTTPS (HTTP Secure) 또는 보안 소켓 레이어(SSL)를 갖춘 HTTP
* HTTP 기본 권한 + HTTPS
HTTP 기본 권한
HTTP 기본 권한(BASIC-AUTH)은 HTTP에 사용된 간단한 메커니즘이다. 이 메커니즘을 사용하여 권한을 부여받지 못한 접근으로 부터 웹 리소스를 방어할 수 있다.
Step 1: 웹 서비스 작성 및 전개
EchoService.jws라는 웹 서비스를 작성.
하지만 서비스는 안전하지 않다. 이를 안전하게 하려면 '%TOMCAT_HOME%\webapps\axis' 내부에 'protected'(본인이 선택해도 무방)라는 디렉토리를 만들고 'EchoService.jws'를 이 디렉토리로 옮긴다. 이제 웹 서비스 URL은 http://localhost:8080/axis/protected/EchoService.jws?wsdl이 되었다.
Step 2:사용자 기밀 정의
새로운 사용자 기밀을 추가하려면 '%TOMCAT_HOME%\conf'에 있는 'tomcat-users.xml'을 편집하고 아래와 같이 새로운 사용자를 추가한다.
Step 3: 웹 서비스 URL에 보안 제한 추가하기
보안 제약을 추가하려면 '%TOMCAT_HOME%\webapps\axis\WEB-INF'에 있는 'web.xml'을 편집하고 <web-app> 엘리먼트의 끝 직전에 이 라인을 삽입한다.
URL http://localhost:8080/axis/protected/EchoService.jws?wsdl로 가서 WSDL에 접근시도 한다. 브라우저는 사용자 권한을 위해 사용자이름과 패스워드를 입력을 요청 할 것이다.
Listing 4. BASIC-AUTH를 사용하여 서비스를 호출하는 클라이언트 작성하기
HttpURLConnection을 사용하는 방법
직접 HTTP Header에 Base64로 인코딩한 유저/패스워드 정보를 설정한다.
참조: http://www.java-tips.org/other-api-tips/httpclient/how-to-use-basic-authentication.html
참조: http://docstore.mik.ua/orelly/java-ent/servlet/ch08_01.htm
참조: http://www.javaworld.com/javaworld/javatips/jw-javatip47.html
HTTP를 이용한 웹 서비스 보안
* HTTP 기본 권한
* HTTPS (HTTP Secure) 또는 보안 소켓 레이어(SSL)를 갖춘 HTTP
* HTTP 기본 권한 + HTTPS
HTTP 기본 권한
HTTP 기본 권한(BASIC-AUTH)은 HTTP에 사용된 간단한 메커니즘이다. 이 메커니즘을 사용하여 권한을 부여받지 못한 접근으로 부터 웹 리소스를 방어할 수 있다.
Step 1: 웹 서비스 작성 및 전개
EchoService.jws라는 웹 서비스를 작성.
하지만 서비스는 안전하지 않다. 이를 안전하게 하려면 '%TOMCAT_HOME%\webapps\axis' 내부에 'protected'(본인이 선택해도 무방)라는 디렉토리를 만들고 'EchoService.jws'를 이 디렉토리로 옮긴다. 이제 웹 서비스 URL은 http://localhost:8080/axis/protected/EchoService.jws?wsdl이 되었다.
Step 2:사용자 기밀 정의
새로운 사용자 기밀을 추가하려면 '%TOMCAT_HOME%\conf'에 있는 'tomcat-users.xml'을 편집하고 아래와 같이 새로운 사용자를 추가한다.
<tomcat-users> <user name="tomcat" password="tomcat" roles="tomcat,manager" /> <user name="role1" password="tomcat" roles="role1" /> <user name="both" password="tomcat" roles="tomcat,role1" /> <!-- Define new user name and password with the role --> <user name="wsuser" password="wspwd" roles="wsuser" /> </tomcat-users> |
Step 3: 웹 서비스 URL에 보안 제한 추가하기
보안 제약을 추가하려면 '%TOMCAT_HOME%\webapps\axis\WEB-INF'에 있는 'web.xml'을 편집하고 <web-app> 엘리먼트의 끝 직전에 이 라인을 삽입한다.
<Security-constraint> <web-resource-collection> <web-resource-name>Protected</web-resource-name> <!-- specify the directory for restricted Web Services application --> <url-pattern>/protected/*</url-pattern> </web-resource-collection> <auth-constraint> <!-- specify the role name of the new user added in step 2 --> <role-name>wsuser</role-name> </web-resource-collection> <auth-constraint> </security-constraint> <!-- Define the Login Configuration for this Application --> <login-config> <auth-method>BASIC</auth-method> <realm-name>Protected Web Services</realm-name> </login-config> <!-- 이거 없으면 경고문 나옴. --> <security-role> <role-name>wsuser</role-name> </security-role> |
URL http://localhost:8080/axis/protected/EchoService.jws?wsdl로 가서 WSDL에 접근시도 한다. 브라우저는 사용자 권한을 위해 사용자이름과 패스워드를 입력을 요청 할 것이다.
Listing 4. BASIC-AUTH를 사용하여 서비스를 호출하는 클라이언트 작성하기
import org.apache.axis.client.Call; import org.apache.axis.client.Service; import javax.xml.namespace.QName; public class TestClient { public static void main(String [] args) { try { String endpoint = "http://localhost:8080/axis/protected/EchoService.jws"; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName(new QName("echoString")); call.setUsername("wsuser"); call.setPassword("wspwd"); String ret = (String) call.invoke( new Object[] { "Hello!" } ); System.out.println("Sent 'Hello!', got '" + ret + "'"); } catch (Exception e) { System.err.println(e.toString()); } } } |
HttpURLConnection을 사용하는 방법
직접 HTTP Header에 Base64로 인코딩한 유저/패스워드 정보를 설정한다.
// HTTP BASIC-AUTH String userPassword = "wsuser" + ":" +"wspwd"; // USERNAME:PASSWORD //// Encode the bytes of the string //String encoding = new sun.misc.BASE64Encoder().encodeBuffer(userPassword.getBytes()); //// Set the "Authorization" request property for the URLConnection //uc.setRequestProperty("Authorization","Basic " + encoding.substring(0, encoding.length() - 2)); // chuck로 인해 줄바꿈 문자 삭제. PW가 길면 문제. String encoding = new String(Base64.encodeBase64(userPassword.getBytes(), false)); // false - chunk하지 않는다(chuck하면 76자 단위로 줄바꿈) uc.setRequestProperty("Authorization","Basic " + encoding); |
'프로그래밍 > Web' 카테고리의 다른 글
[jQuery] select option (0) | 2009.05.14 |
---|---|
[JavaScript] language="JavaScript" type="text/javascript" (0) | 2009.04.07 |
[Servlet] Servlet에서 request의 input stream을 이용해서 읽어들일 때 (0) | 2009.02.19 |
[펌] Getting the Requesting URL in a Servlet (0) | 2009.02.19 |
[스터디] Ajax 마스터하기, Part 11: 서버 측의 JSON (0) | 2009.02.16 |