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

Java|2018. 1. 9. 15:05

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


댓글()

WildFly (JBoss)가 자동 적용하는 라이브러리 배제 방법

Java|2017. 8. 7. 19:50

톰캣에서는 잘 돌아가던 애플리케이션이, WildFly에 배포해서 사용하려고 하면 로깅 부터 시작해서 여러가지 문제가 발생하는 경우가 있다. WildFly의 버전을 올리면 해결되는 경우도 있지만, 버전을 올릴 수 없는 경우에는 WildFly가 제공하는 디펜던시(dependencies)를 배제하여 애플리케이션의 자체 디펜던시를 사용하도록 조정해야 한다.

이를 위해서는 WEB-INF/jboss-deployment-structure.xml 파일을 만들고 아래와 같이 배제할 모듈을 명시하면 된다.

    <?xml version="1.0" encoding="UTF-8"?>
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
        <deployment>
            <exclude-subsystems>
                <subsystem name="logging" />
                <subsystem name="jaxrs" />
                <subsystem name="resteasy" />
            </exclude-subsystems>
            <!-- exclusions allow you to prevent the server from automatically adding some dependencies -->
            <exclusions>
                <module name="org.slf4j" />
                <module name="org.slf4j.impl" />
                <module name="org.slf4j.jcl-over-slf4j"/>
                <module name="org.apache.commons.logging"/>
                <module name="org.apache.log4j"/>
                <module name="javaee.api" />
                <module name="javax.xml.bind.api" />
                <module name="com.fasterxml.jackson.core.jackson-core" />
                <module name="com.fasterxml.jackson.core.jackson-databind" />
                <module name="com.fasterxml.jackson.core.jackson-annotations" />
                <module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" />
                <module name="org.jboss.resteasy.resteasy-jaxb-provider" />
                <module name="org.jboss.resteasy.resteasy-jettison-provider"/>
                <module name="org.jboss.resteasy.resteasy-jackson-provider"/>
                <module name="org.jboss.resteasy.resteasy-jackson2-provider" />
            </exclusions>
        </deployment>
    </jboss-deployment-structure>

배제할 모듈의 이름을 알아 내기 위해서는, $WILDFLY_HOME/modules/system/layers/base 디렉토리 하위의 각 디렉토리에서 module.xml 파일 내용을 확인하면 된다.


추가: 참고로 위의 설정 파일을 사용해서, WildFly( 9.0.2.Final 버전)에서 CONSOLE 로거로 Logback 로그를 출력하는 데에는 실패했습니다. 다만 FILE 로거로는 출력이 잘 됩니다.


EOF


댓글()