JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
https://softwaresaramdle.tistory.com/48
[Spring Boot] Security6 토큰 기반 인증에 대한 설명
토큰의 개요토큰은 사용자가 로그인할 때 생성되는 고유한 문자열입니다.이 토큰은 UUID 형식일 수도 있고, JSON Web Token (JWT) 형식일 수도 있습니다.사용자는 로그인 후 이 토큰을 받아서, 이후의
softwaresaramdle.tistory.com
https://softwaresaramdle.tistory.com/49
[Spring Boot] Security6 JWT Token (1)
JWT (JSON Web Token)에 대한 설명JWT는 JSON Web Token의 약자로, JSON 형식의 데이터를 웹 요청에서 사용할 수 있도록 설계된 토큰입니다. JWT는 인증 및 인가 과정에서 유용하며, 특히 클라이언트와 백엔드
softwaresaramdle.tistory.com
https://softwaresaramdle.tistory.com/50
[Spring Boot] Security6 JWT Token (2)
JWT 토큰에 대한 이해와 보안의 중요성JWT 토큰의 세 번째 부분: 서명(Signature)서명은 JWT 토큰의 선택적인 부분입니다.내부 애플리케이션 간의 신뢰할 수 있는 통신에서는 서명이 필요하지 않을 수
softwaresaramdle.tistory.com
JWT는 Header.Payload.Signature 구조로 이루어져 있다. 각 요소는 다음 기능을 수행한다.
- Header
- JWT임을 명시
- 사용된 암호화 알고리즘
- Payload
- 정보
- Signature
- 암호화알고리즘((BASE64(Header))+(BASE64(Payload)) + 암호화키)
JWT의 특징은 내부 정보를 단순 BASE64 방식으로 인코딩하기 때문에 외부에서 쉽게 디코딩 할 수 있다.
외부에서 열람해도 되는 정보를 담아야하며, 토큰 자체의 발급처를 확인하기 위해서 사용한다.
package com.example.loans_domain.auth.jwt;
import io.jsonwebtoken.Jwts;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Date;
@Component // 이 클래스는 Spring의 컴포넌트로 관리됨을 나타냅니다.
public class JWTUtil {
private SecretKey secretKey;
// JWTUtil 생성자 - secret 값을 받아 SecretKey를 초기화
public JWTUtil(@Value("${spring.jwt.secret}") String secret) {
// secret 값을 이용해 SecretKey를 생성합니다.
secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), Jwts.SIG.HS256.key().build().getAlgorithm());
}
// 토큰에서 사용자 이메일을 추출하는 메소드
public String getUsername(String token) {
// 토큰을 파싱하여 "email" 클레임 값을 반환합니다.
return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().get("email", String.class);
}
// 토큰에서 사용자 역할을 추출하는 메소드
public String getRole(String token) {
// 토큰을 파싱하여 "role" 클레임 값을 반환합니다.
return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().get("role", String.class);
}
// 토큰이 만료되었는지 확인하는 메소드
public Boolean isExpired(String token) {
// 토큰을 파싱하여 만료일을 확인한 후 현재 시간과 비교합니다.
return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().getExpiration().before(new Date());
}
// 새로운 JWT 토큰을 생성하는 메소드
public String createToken(String username, String role, Long expiration) {
// JWT 토큰을 생성하고 클레임에 이메일, 역할, 발행일, 만료일을 포함합니다.
return Jwts.builder()
.claim("email", username) // 이메일 클레임 추가
.claim("role", role) // 역할 클레임 추가
.issuedAt(new Date(System.currentTimeMillis())) // 토큰 발행 시간 설정
.expiration(new Date(System.currentTimeMillis() + expiration)) // 토큰 만료 시간 설정
.signWith(secretKey) // SecretKey를 사용하여 서명
.compact(); // 토큰 문자열로 변환
}
}
- JWTUtil: 애플리케이션에서 JSON Web Token(JWT)을 처리하기 위한 유틸리티 클래스입니다.
- 생성자:
- 애플리케이션 설정 파일에 지정된 비밀 키를 사용하여 JWT 서명을 위한 비밀 키를 초기화합니다.
- 메서드:
- getUsername(String token): 주어진 JWT 토큰에서 사용자 이름을 추출합니다.
- getRole(String token): 주어진 JWT 토큰에서 역할(role)을 추출합니다.
- isExpired(String token): 주어진 JWT 토큰이 만료되었는지 확인합니다.
- createToken(String username, String role, Long expiration): 지정된 사용자 이름, 역할 및 만료 시간을 포함하는 새로운 JWT 토큰을 생성합니다.