반응형

웹 기반에서 api를 통해 정보를 주고받는 일이 빈번하게 발생하고 있습니다. 이런 경우 jwt를 이용해 보도록 하겠습니다. jwt에 대해 정의된 곳은 많이 있으며 아래 공식 사이트에서 자세한 정보 확인이 가능합니다.

 

https://jwt.io/

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

여기에서는 사용하는 라이브러리 위주로 사용하며 기술 하도록 하겠습니다. jwt를 이용해 다음과 같은 프로세스를 만들어 보겠습니다.

 

 


시스템은 입력한 값이 원본 데이터 파일과 jwt을 생성하고 생성한 String 역시 파일로 저장 합니다. 그리고 해당 정보를 확인 할 수 있는 URL을 생성합니다. 사용자는 생성된 URL로 접속하여 시스템에 입력된 정보를 확인 합니다.
정보 확인 시 데이터 파일에 직접 접근하지 않고 생성된 jwt로 데이터 정보를 확인합니다. 이렇게 하여 원본 데이터의 접근을 제어하고 보호 할 생각입니다.

 

구성도를 진행하기 전 사용하는 라이브러리 정보는 다음과 같습니다.

java-jwt 3.2.0

 

먼저 jwt String을 생성해 보겠습니다. jwt는 header, payload, claims의 3가지 부분으로 구성이 되며 제가 입력하는 정보는
payload에 저장되게 되어 있습니다.

아래 자바 코드는 기본적인 jwt 생성 예제입니다.

 String token = JWT.create().withIssuer("deluser").withClaim("jwt", "testcase").sign(algorithm);      
 System.out.println(token.toString()); 
     
    /** 
     * 복호화 하기 
     * 생성된 jwt을 확인하고 토큰에 저장된 값을 확인함 
     * */ 
    DecodedJWT jwt = JWT.decode(token.toString()); 
    System.out.println("## header : " + jwt.getHeader() + ", alg : " + jwt.getAlgorithm() + ", type : " + jwt.getType()); 
    System.out.println("## payload : " + jwt.getPayload() + ", issuer : " + jwt.getIssuer()); 
    System.out.println("## claims : " + jwt.getClaims()); 
     
    /** 
     * payload의 데이터 확인은 다음과 같이 withClaim에 입력한 key를 이용해 검색이 가능 
     * */ 
    String jwtInfo = jwt.getClaims().get("jwt").asString(); 
    System.out.println("## jwt info : " + jwtInfo);

 

위 코드를 사용해 보시면 알겠지만 컴파일 시 동일한 토큰이 생성됩니다. 그래서 동일한 토큰이 생성되지 않게 하기 위해 withClaim에 사용기간, 생성 일시를 추가합니다. 

 

 

그런 경우 토큰 생성하는 데이터가 변경이 되기 때문에 매번 다른 형식의 토큰이 발급됩니다.

 Algorithm algorithm = Algorithm.HMAC256("secret"); //알고리즘 설정 
     
    /** 
     * jwt string 생성하기 
     * JWT.create()를 사용해 쉽게 생성이 가능하고 withClaim 에 payload 에 저장되는 값을 지정한다 
     * */ 
    Date toDate = new Date(); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    String toDay = sdf.format(toDate); 

    String token = JWT.create().withIssuer("deluser").withClaim("jwt", "testcase").withClaim("cdate", toDay).sign(algorithm); 
     
    System.out.println(token.toString()); 
     
    /** 
     * 복호화 하기 
     * 생성된 jwt을 확인하고 토큰에 저장된 값을 확인함 
     * */ 
    DecodedJWT jwt = JWT.decode(token.toString()); 
    System.out.println("## header : " + jwt.getHeader() + ", alg : " + jwt.getAlgorithm() + ", type : " + jwt.getType()); 
    System.out.println("## payload : " + jwt.getPayload() + ", issuer : " + jwt.getIssuer()); 
    System.out.println("## claims : " + jwt.getClaims()); 
     
    /** 
     * payload의 데이터 확인은 다음과 같이 withClaim에 입력한 key를 이용해 검색이 가능 
     * */ 
    String jwtInfo = jwt.getClaims().get("jwt").asString(); 
    String jwtDay = jwt.getClaims().get("cdate").asString(); 
    System.out.println("## jwt info : " + jwtInfo + ", create date : " + jwtDay);

위 와 같이 토큰 생성 시간을 추가하면 시그니처 값이 변경되는 것을 확인할 수 있습니다. 본문을 수정하는 방법과 파일 생성하는 것은 다음 시간에 이어서 하도록 하겠습니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기