본문 바로가기

Spring Boot

[Spring Boot] JWT, JWS, JWE 개념 및 차이점

728x90

JWT (JSON Web Token)

JWT는 JSON 객체를 사용하여 두 당사자 간에 정보를 안전하게 전송하기 위한 컴팩트하고 자가 포함된 방식입니다. JWT는 주로 인증 및 정보 교환에 사용됩니다.

 

JWS (JSON Web Signature)

JWS는 JWT의 한 형태로, JSON 데이터를 디지털 서명하여 무결성을 보장합니다. 서명된 토큰은 원본 데이터의 변경 여부를 확인할 수 있습니다. JWS는 주로 인증에 사용됩니다.

 

JWE (JSON Web Encryption)

JWE는 JWT의 또 다른 형태로, JSON 데이터를 암호화하여 기밀성을 보장합니다. 암호화된 토큰은 데이터를 보호하고 인가된 수신자만이 내용을 볼 수 있도록 합니다. JWE는 주로 기밀 데이터 교환에 사용됩니다.

 

차이점 및 장단점

특성 JWT (일반) JWS JWE
보안 특성 서명 없음, 평문 서명으로 무결성 보장 암호화로 기밀성 보장
사용 용도 정보 교환 인증, 무결성 확인 기밀 데이터 교환
장점 간단하고 빠름 변조 방지, 서명 검증 가능 기밀성 보장, 데이터 보호
단점 변조에 취약 기밀성 없음, 데이터 노출 가능 복잡하고 처리 비용이 높음
구성 요소 Header, Payload, Signature 없음 Header, Payload, Signature Header, Encrypted Key, IV, Ciphertext, Tag

 

Spring Boot에서 JWT, JWS, JWE 사용 예제

 

JWT (일반) 사용 예제 ( jjwt 라이브러리 )

1. Gradle 설정

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'io.jsonwebtoken:jjwt-api:0.11.2'
    runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2'
    runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.2'
}

 

2. JWT 생성 및 검증

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.crypto.SecretKey;
import java.util.Date;

@RestController
@RequestMapping("/api")
public class JwtController {

    private static final SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    @GetMapping("/token")
    public String generateToken() {
        return Jwts.builder()
        	.subject("user")
                .signWith(key)
                .issuedAt(new Date()) // 생성 일
                .expiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60)) // 유효기간 1시간
                .compact();
    }

    @GetMapping("/validate")
    public String validateToken(String token) {
        try {
            Jwts.parser()
                .verifyWith(key)
                .build()
                .parseSignedClaims(token);
            return "Valid Token";
        } catch (Exception e) {
            return "Invalid Token";
        }
    }
}

결론

  • JWT: 기본적인 토큰 사용. 빠르고 간단하지만 변조에 취약할 수 있음.
  • JWS: 서명된 토큰으로, 무결성을 보장. 인증에 적합.
  • JWE: 암호화된 토큰으로, 기밀성을 보장. 민감한 데이터 교환에 적합.