JWT / JWS 정리

UkJJang·2021년 10월 4일
4

JWT (Json Web Token)

  • RFC 7519 웹 표준으로 지정이 되어있으며 Json 객체를 사용해서 토큰 자체에 정보들을 저장하고 있는 Web Token이다.
  • 클라이언트와 서버, 서비스와 서비스 사이 통신 시 권한 인가를 위해 사용하는 토큰이다.
  • URL에대해 안전한 문자열로 구성되어 있기 때문에 HTTP 어디든 위치할 수 있다.
  • JWE or JWS 를 뜻한다

JWT의 장점

  1. 중앙의 인증서버, 데이터 스토어에 대한 의존성이 없다.
  2. 시스템 수평 확장에 유리하다
  3. Base64 URL Safe Encoding > URL, Cookie, Header 모두 사용이 가능하다.

JWT의 단점

  1. Payload의 정보가 많아지면 네트워크 사용량 증가, 데이터 설계 고려가 필요하다.
  2. 토큰이 클라이언트에 저장, 서버에서 클라이언트의 토큰을 조작할 수 없다.

JWS (Json Web Signature)

  • 서버에서 인증을 근거로 인증정보를 서버의 private key로 서명 한것을 토큰화 한것

    JWT의 구조는 header(json) + payload(json) + signature 로 이루어져 있다.
    헤더에는 어떻게 검증하는지 시그니처를 해싱하기 위한 알고리즘 정보들이 담겨져 있다.
    페이로드는 JWT에 대한 내용 즉 서버와 클라이언트가 주고받기로 한 값들로 구성되어 있다.
    시그니쳐는 토큰의 유효성을 검증하기 위한 문자열로 구성되더 있다.
    JWS는 클라이언트가 로그인을 시도할 경우 > 서버에서 payload에 담고 싶은 내용을 담아(로그인 한 사람의 정보, 접근권한) 서명하고 Token을 발행해준다. 그렇게 된다면 클라이언트는 다음 통신에서 토큰값 함께 전달하고 서버에서는 Token을 수신하여 검증 후 절차 로직을 실행한다.

JWE (Json Web Encryption)

  • 서버와 클라이언트 간 암호화된 데이터를 토큰화 한 것

JWK (Json Web Key)

  • JWE 에서 payload encryption에 쓰인 키를 토큰화 한 것

JWT구조

  • HEADER : 시그니처를 해싱하기 위한 알고리즘 정보가 담겨져 있는 부분
  • PAYLOAD : claim을 담고있는 부분이다.

    Claim : 사용자에 대한 프로퍼티를 담고있는 정보로 3가지 타입이 존재한다.

    1. Reserved Claims : 정보 교환에 유용하도록 미리 정의되어 있는 클레임 이 클레임은 필수적이지 않고 Optional이다.
    2. Public Claims : 충돌이 방지된 네임스페이스를 담고있는 URI와 같이 이름이 충돌되지 않도록 해야함
    3. Private Claims : 서버와 클라이언트가 정보를 공유하기 위해 사용하기로한 클레임 정보
  • SIGNATURE : 서명은 토큰이 변조되지 않았음을 증명하는 무결성을 위해 사용된다. 시그니쳐는 인코딩된 헤더, 페이로드, 비밀키, 헤더에 정의된 서명 알고리즘을 이용하여 생성한다.

Spring JWT 객체

/**
* 토큰생성
*/
String jwt = Jwt.builder()
	    //header
            .setHeaderParam("typ","JWT") // 토큰타입
            .setSubject("EXMAPLE") // 토큰제목
            //payload
            .claim("username","uk") // private claim
            .claim("userage","26") // private claim
            .setIssuedAt(new Date(System.currentTimeMillis()) // 토큰 생성날짜
            .setExpiration(new Date(System.currentTimeMillis() + 3600) // 토큰 유효시간
            //signatue
            .signWith(SignatureAlgorithm.HS512, "Uk".getByte("UTF-8"))
            .compact();
            
/**
* 토큰검증
*/
try{
	Jwts.parser().setSignatureKey("Uk".getByte("UTF-8")).parseClaimsJws(jwt);
    //return true;
} catch(Exception e) {
	e.printStackTrace();
}
   

Spring JWT 토큰 검증 예외

  1. ExpiredJwtException : JWT의 유효시간 초과했을 경우
  2. UnsupportedJwtException : JWT의 형식이 일치 하지 않을 경우
  3. MalformedJwtException : JWT가 올바르게 구성되지 않을 경우
  4. SignatureException : JWT의 기존 signature 검증이 실패 했을 경우
  5. PrematureJwtException : nbf를 선언했을 경우 토큰 유효 시간전에 사용했을 경우
  6. ClaimJwtException : JWT에서 권한 Claim 검사를 실패했을 경우
profile
꾸준하게 성실하게

0개의 댓글