Apr 242012
 

HTTP 헤더를 분석하다 보면 브라우저 정보 혹은 사용자 정보를 쉽게 확인하는 방법중에 하나로 User-Agent 헤더를 분석하는 경우가 많다.

생각보다 많은 정보를 가지고 있습니다. 참고할만한 사이트가 있어서 공유합니다.

http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx

다른 브라우저도 비슷한 구조를 가지고 있으면, MS의 Internet Explorer 운영 환경을 파악하는데 도움이 된다. 특히 아래와 같이 OS정보는 바로 응용이 가능합니다.

그리고 추가적으로 User-Agent 정보만 모아둔 사이트도 있다.
사이트에 보면 Chrome(http://www.useragentstring.com/pages/Chrome/) 혹은 Safari(http://www.useragentstring.com/pages/Safari/)에 대한 정보도 얻을수 있다.

http://www.useragentstring.com/pages/useragentstring.php

프로그램으로 웹클라이언트를 구현할때에도 해당 값들을 이용해서 신규로 생성하거나, 흉내를 낼수 있다.

Print Friendly
Apr 172012
 

HTTP/1.1 에서 Cache와 관련된 헤더중에 If-Modified-Since와 ETag를 사용하는 방법이 있습니다.

ETag에 대한 설명은 아래에서 확인이 가능합니다.

http://en.wikipedia.org/wiki/HTTP_ETag

여기서 궁금한 것은 국내에서 많이 사용하고 있는 Apache 웹서버에서는 ETag 값을 어떻게 생성하는지가 궁금해서 소스를 다운받아서 확인을 해봤다.

아래 주석에서와 같이 inode-size-mtime 으로 구성이 하되, hex 값으로 변환을 해서 사용하도록 되어 있습니다. 물론 filetype이 0인 경우에는 mtime값만을 사용하는 것을 149라인에서 확인을 할수 있다.

    113     if (r->finfo.filetype != 0) {
    114         /*
    115          * ETag gets set to [W/]"inode-size-mtime", modulo any
    116          * FileETag keywords.
    117          */
    118         etag = apr_palloc(r->pool, weak_len + sizeof("\"--\"") +
    119                           3 * CHARS_PER_UINT64 + 1);
    120         next = etag;
    121         if (weak) {
    122             while (*weak) {
    123                 *next++ = *weak++;
    124             }
    125         }
    126         *next++ = '"';
    127         bits_added = 0;
    128         if (etag_bits & ETAG_INODE) {
    129             next = etag_uint64_to_hex(next, r->finfo.inode);
    130             bits_added |= ETAG_INODE;
    131         }
    132         if (etag_bits & ETAG_SIZE) {
    133             if (bits_added != 0) {
    134                 *next++ = '-';
    135             }
    136             next = etag_uint64_to_hex(next, r->finfo.size);
    137             bits_added |= ETAG_SIZE;
    138         }
    139         if (etag_bits & ETAG_MTIME) {
    140             if (bits_added != 0) {
    141                 *next++ = '-';
    142             }
    143             next = etag_uint64_to_hex(next, r->mtime);
    144         }
    145         *next++ = '"';
    146         *next = '\0';
    147     }
    148     else {
    149         /*
    150          * Not a file document, so just use the mtime: [W/]"mtime"
    151          */
    152         etag = apr_palloc(r->pool, weak_len + sizeof("\"\"") +
    153                           CHARS_PER_UINT64 + 1);
    154         next = etag;
    155         if (weak) {
    156             while (*weak) {
    157                 *next++ = *weak++;
    158             }
    159         }
    160         *next++ = '"';
    161         next = etag_uint64_to_hex(next, r->mtime);
    162         *next++ = '"';
    163         *next = '\0';
    164     }

아래는 실제 Apache 서버에서 받은 HTTP 헤더에 들어 있는 ETag 값입니다.

위의 ETag 값을 검증해보기 위해서 마지막에 있는 0467ddaad 값을 10진수로 변환을 하고, 해당 값을 Unix Timestamp로 변환을 해보면 다음과 같이 확인이 가능합니다.

Print Friendly
Apr 062012
 

인터넷을 이용할 때 현재 접속 정보를 확인해야 할 경우가 많습니다.
특히 외부에서 무선으로 연결해서 특정 AP를 이용할 경우에는 자기 정보 확인을 하면 여러가지 도움을 받을 수 있습니다.
(서버 및 방화벽 연결시 활용, 접속 ISP 정보등등..)

그리고 스마트폰 및 각종 인터넷에 연결이 되는 장비를 사용하는 얼리어텁터라면 알고 싶어 하는 것이 해당 인터넷에 접속하는 브라우저의 정보입니다.

이런 정보를 예전부터 저혼자 사용하고 있던 부분을 공개합니다.
아래의 접속 경로를 통해서 접속하시면 볼수 있습니다.

http://blog.sukmoonlee.com/env.php

아래는 현재 결과 샘플입니다.

Print Friendly
Apr 052012
 

공공 개발을 하다 보면 행정 시스템과 연동해서 개발해야 하는 경우가 발생합니다.

기본적으로 행정 시스템에 직접 접속할수 없기 때문에 SOAP 기반의 웹서비스(WSDL)을 기반으로 데이타를 요청하고, 수신해야 합니다.

이를 위해서는 담당 공무원이 새올행정 통합지원센터를 통해서 연계아이디를 발급받고, 코드를 발급받아야 합니다.
그리고 연동 담당자와 각 서비스별로 담당자와 연계 쿼리를 발급받고, 해당 정보를 담아서 서비스로 받아야 합니다.
(여기서부터 자연스럽게 연계담당자와 통화를 좀 많이 하셔야 합니다. -_-)

나머지는 메뉴얼을 보고 연계를 하면 되지만, 처음 개념을 알지 못하면 정말 힘든 작업입니다.
그리고 중요한 것은 웹서비스(WSDL)로 통신을 하기 때문에 요청할떄 MIME 유형과 encoding 형태를 잘 맞춰야 합니다.

많이 사용하는 AXIS등을 사용하기 위해서는 웹서버의 환경과 연계서버의 환경을 잘 고려해야 합니다.
(초기에 연계서버를 개발할때 개발용 PC환경, 개발서비스 시스템과 실서비스가 환경이 모두 달라서 여러 경험을 했었습니다. 만약 해당 사항이 맞지 않으면 HTTP 500 Response가 나오기 때문에 무엇 때문에 오류인지도 모르고 고생하는 경우가 발생됩니다.)

무식한 저는 이런 고생을 많이 했고, 짧은 기간에 프로젝트를 완료해야 했기 때문에 서버의 상태를 검증하기 보다는 프로젝트 완료를 빨리 진행하기 위해서 웹클라이언트를 만들어서 처리를 빨리 했습니다. -_-

아래와 같이 Connection을 만들고, 직접 XML을 생성해서 보내는 방식이죠.

URL url = new URL(“http://”);
URLConnection con = url.openConnection();
con.addRequestProperty(“SOAPAction”,”");
con.setRequestProperty(“Content-Type”,”text/xml; charset=euc-kr”);
con.setDoOutput(true);

다시 받은 데이타도 XML을 파싱루틴도 만들어서 처리를 하면 됩니다.

하지만 또 하나의 난관은 개인정보가 될만한 사항이 있는 것은 GPKI 통신을 해야 합니다.
이를 위해서는 추가적으로 GPKI 서버용 인증 코드를 발급받아서 새올연동 서버에 등록을 해야 합니다.
그리고는 LDAP을 통해서 연계할 서버의 공개키블 받아서 저장해두고, 해당 키들로 초기화를 해야 합니다. 그런 다음 만든 XML의 일부분을 GPKI encode를 해서 전달하고, 받은 데이타의 일부분을 decode 해서 확인을 해야 합니다.
(샘플 프로그램에도 있지만, 암호화되 데이타는 base64로 encode를 해야 하며, 복호화할때에도 base64로 decode를 먼저 한 다음에 해야 합니다.)

주의할 점은 Java용 GPKI 모듈은 JNI 를 사용하기 때문에 OS에 맞는 버전으로 설치를 해야 하며, 서버에 미리 설치해서 검증을 할 수 있습니다.
또 새올행정 서버의 공개키를 받을때는 샘플 프로그램을 이용하는 방법도 있지만, LDAP 클라이언트를 하나 구해서 저장하는 방식이 더 편리합니다.
(저는 잘 몰라서 2가지 방법 모두 했습니다. -_-)

실제로 개발보다는 연동을 하기 위해서 연계팀과 진행해야 할 부분이 많으며, 경험이 있다면 쉽지만, 그렇지 않으면 처음에는 조금 고생을 하셔야 합니다.

Print Friendly
Plugin from the creators of Brindes :: More at Plulz Wordpress Plugins