AXBoot: WildFly 9을 사용할 때의 JWTSessionHandler 문제

com.chequer.axboot.admin.utils.JWTSessionHandler는 javax.xml.bind.DatatypeConverter 클래스를 이용하여 BASE64 인코딩/디코딩을 수행합니다.
그런데 WildFly 9 버전의 경우에는 문제가 있습니다. WildFly 9은 JDK의 DatatypeConverter를 사용하는게 아니라 별도의 내장된 버전을 사용하기 때문입니다.

좀 더 정확하게는 wildfly-9.0.2.Final/modules/system/layers/base/javax/xml/bind/api/main/jboss-jaxb-api_2.2_spec-1.0.4.Final.jar 파일에 포함된 것을 사용합니다.

이 버전은 URL-safe 하지 않은 인코딩을 수행하기 때문에 쿠키를 이용한 로그인이 불가능한 심각한 문제가 발생합니다.

아래와 같이 Apache Commons Codec 프로젝트의 Base64 클래스를 사용하도록 수정하면 문제가 해결됩니다.

    import org.apache.commons.codec.binary.Base64;

    private String toBase64(byte[] content) {
        return Base64.encodeBase64URLSafeString(content);
    }

    private byte[] fromBase64(String content) {
        return Base64.decodeBase64(content);
    }

DatatypeConverter 를 써야하는 특별한 이유가 없다면 원본 소스도 이렇게 변경하는게 좋을 것 같습니다. 어차피 Commons Codec 프로젝트에는 이미 디펜던시가 있으니까요.


EOF


맥 OS(OSX)에서 생성한 파일 이름을 윈도(Windows)에 맞게 변경

크롬(Chrome) 이나 파이어폭스(Firefox) 브라우저를 이용하는 방법이다.


크롬(혹은 파이어폭스)에서 F12 키를 누르면 개발자 도구 가 나타난다. 

Console 탭을 클릭해서 이동한 후, 빈 곳을 클릭하면 입력 가능한 상태가 된다. 이곳에 파일명 문자열을 붙여넣고 따옴표로 감싼다. 그리고 바로 뒤에 .normalize() 를 붙여준다. 

아래의 예와 같이 넣으면 된다.

"ㅅㅏㅇㅓㅂㄱㅖㅎㅗㅣㄱㅅㅓ ㅅㅔㅂㅜ.hwp".normalize()

이제 엔터키를 치면 바로 아랫줄에 동일한 문자열이 나오는데 이를 복사해서 사용하면 된다.


만약 OSX 형식으로 다시 변경하고 싶으면 아래와 같이 괄호 안에 NFD 를 추가해서 실행한다.

"사업계획서 세부.hwp".normalize("NFD")

사실 이 방법은 JavaScript의 함수를 이용한 것으로 아래 링크로 가면 더 자세한 내용을 볼 수 있다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/normalize



EOF




Chrome - 캐시에 있는 이미지 저장

Chrome 브라우저의 캐시에 있는 이미지를 저장해야 할 때가 있다.
나의 경우, 주로 지금 보고 있는 웹페이지에 있는 다량의 이미지를 다운로드 하고 싶은 경우다.

아래 링크의 ChromeCacheView 를 다운로드 받아서 사용하면 된다.

ChromeCacheView 홈페이지
ChromeCacheView 다운로드

한글로 사용하고 싶으면, 아래 링크의 한글 언어 파일을 받아서 ChromeCacheView 실행 파일과 동일한 폴더에 두면 된다.

한글 언어팩 다운로드

ChromeCacheView 를 실행하면 캐시에 있는 파일의 목록이 주르륵 나온다.
목록에서 저장을 원하는 파일을 선택한 다음에 File > Copy Selected Cache Files To... 메뉴를 클릭하거나, 툴바의 세번째 버튼을 클릭하면 원하는 폴더에 저장할 수 있다.


EOF

AXBoot Framework - war 파일 형태로 실행

AXBoot Initialzr 로 생성한 프로젝트는 war 파일 형태로 바로 실행이 안된다.
안되길래 그냥 프로젝트 루트에서 $ mvn spring-boot:run 으로 실행했었는데, war 만 배포해서 실행할 일이 생겼다.

원인을 찾아보니 별일은 아니었다. 아래와 같이 Spring Boot Maven Plugin 을 pom.xml 의 plugins 부분에 추가하면 된다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!-- ... -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.5.7.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

위 코드는 아래의 Spring Boot 공식 문서에서 가져온 것이다.

Spring Boot Maven plugin

자세한 설명은 가서 보시길.



EOF




Vagrant Share를 이용하여 외부에서 사내의 웹 서비스에 접속

외부의 고객에게 현재 개발 중인 웹 서비스 상태를 보여 줄 일이 가끔 있습니다.
이럴 때 내 랩탑의 Vagrant Box를 사외에서 접근하도록 할 수 있다면 꽤 편리할 겁니다.

실제로 Vagrant Share라는 기능을 이용하면 이렇게 할 수 있습니다. 꽤 간편하죠.

한 번 해 봅시다.

우선 아래와 같은 Vagrantfile과 provision.sh 파일을 만듭니다.

Vagrantfile

Vagrant.configure(2) do |config|
  config.vm.box = "hashicorp/precise32"
  config.vm.provision "shell", path: "provision.sh"
  config.vm.network "forwarded_port", guest: 80, host: 8080, id: "nginx"
end

provision.sh

apt-get -y update
apt-get -y install nginx
service nginx start

우분투 OS에 nginx를 설치하고 호스트의 8080 포트로 웹 서비스에 접근할 수 있도록 설정했습니다.

이제 vagrant up 명령으로 박스를 실행합니다.

C:\workspace\vagrant-share_ngrok>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'hashicorp/precise32' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'hashicorp/precise32'
    default: URL: https://atlas.hashicorp.com/hashicorp/precise32
==> default: Adding box 'hashicorp/precise32' (v1.0.0) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/hashicorp/boxes/precise32/versions/1.0.0/providers/virtualbox.box
==> default: Box download is resuming from prior download progress
    default: Progress: 100% (Rate: 561k/s, Estimated time remaining: --:--:--)
==> default: Successfully added box 'hashicorp/precise32' (v1.0.0) for 'virtualbox'!
==> default: Importing base box 'hashicorp/precise32'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'hashicorp/precise32' is up to date...
==> default: Setting the name of the VM: vagrant-share_ngrok_default_1505748939539_53687
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 80 (guest) => 8080 (host) (adapter 1)
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    ......
    ......
    ......
==> default: Setting up nginx (1.1.19-1ubuntu0.8) ...
==> default: Processing triggers for libc-bin ...
==> default: ldconfig deferred processing now taking place
==> default: Starting nginx:
==> default: nginx.

C:\workspace\vagrant-share_ngrok>

실행이 완료되면 아래 페이지에서 ngrok를 다운로드 합니다.

Download ngrok

다운로드 받은 파일의 압축을 해제하면 나오는 실행 파일을 적당한 곳에 풀어주고 해당 폴더를 시스템 PATH 에 추가합니다.
Vagrant Share가 실행될 때 ngrok 실행 파일을 찾을 수 있어야 하기 때문에 필요한 작업입니다.

ngrok을 이용하면 Vagrant와 관계 없이 개발용 랩탑에서 실행되는 웹서비스 등을 퍼블릭 망에서 접근이 가능하게 할 수 있습니다.
8080 포트를 열고 싶으면 간단히 ngrok http 8080 을 실행하면 됩니다. 나머지는 ngrok 을 실행하면 나오면 도움말을 참고하세요.

이제 새 명령 프롬프트를 띄우고 vagrant share 명령을 실행합니다.

C:\workspace\vagrant-share_ngrok>vagrant share
Vagrant Share now defaults to using the `ngrok` driver.
The `classic` driver has been deprecated.

For more information about the `ngrok` driver, please
refer to the documentation:

  https://www.vagrantup.com/docs/share/
==> default: Detecting network information for machine...
    default: Local machine address: 127.0.0.1
    default:
    default: Note: With the local address (127.0.0.1), Vagrant Share can only
    default: share any ports you have forwarded. Assign an IP or address to your
    default: machine to expose all TCP ports. Consult the documentation
    default: for your provider ('virtualbox') for more information.
    default:
    default: Local HTTP port: 8080
    default: Local HTTPS port: disabled
    default: Port: 8080
    default: Port: 2222
==> default: Creating Vagrant Share session...
==> default: HTTP URL: http://030a7496.ngrok.io
==> default:

Vagrant가 박스에서 실행 중인 웹 서비스의 포트를 찾아서 이를 외부에 열어 줍니다.
이제 실행 후 출력된 주소(위의 경우는 http://030a7496.ngrok.io)를 고객에게 알려주기만 하면 됩니다.

미리 확인해 보려면 스마트폰(LTE)으로 접속해 보면 되겠죠.


EOF