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: 암호화된 토큰으로, 기밀성을 보장. 민감한 데이터 교환에 적합.
'Spring Boot' 카테고리의 다른 글
[Spring Boot] @Component와 @Configuration의 특징과 차이점 (0) | 2024.07.09 |
---|---|
[Spring Boot] BCrypt, SCrypt, Argon2 비밀번호 암호화 기법 (0) | 2024.07.09 |
[Spring Boot] @Value와 @ConfigurationProperties 차이점 (0) | 2024.07.08 |
[Spring Boot] HandlerMethodArgumentResolver 역할과 예제 (0) | 2024.07.02 |
[Spring Boot] Spring Boot CORS 설정 (0) | 2024.06.28 |