[HTTP] HTTP BASIC-AUTH

프로그래밍/Web 2009. 2. 27. 14:59 Posted by galad
참조: 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'을 편집하고 아래와 같이 새로운 사용자를 추가한다.
<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);