JWT 발급과 검증
- 로그인시 -> 성공 -> JWT 발급
- 접근시 -> JWT 검증
JWT에 관해 발급과 검증을 담당할 클래스가 필요하다. 따라서 JWTUtil이라는 클래스를 생성하여 JWT 발급, 검증 메소드를 작성한다.
JWT생성 원리
- JWT.IO 공식 홈페이지
- 문자열 형태가 있는데 . 을 기준으로 Header.Payload.Signature 구분 -> 외부에 데이터 전달.
JWT는 Header.Payload.Signature 구조로 이루어져 있다. 각 요소는 다음 기능을 수행한다.
- Header
- JWT임을 명시
- 사용된 암호화 알고리즘
- Payload
- 정보
- Signature
- 암호화알고리즘 ((BASE64(Header)) + (BASE64(Payload)) + 암호화키)
JWT의 특징은 내부 정보를 단순 BASE64 방식으로 인코딩하기 때문에 외부에서 쉽게 디코딩 할 수 있다.
외부에서 열람해도 되는 정보를 담아야하며, 토큰 자체의 발급처를 확인하기 위해서 사용한다.
(지폐와 같이 외부에서 그 금액을 확인하고 금방 외형을 따라서 만들 수 있지만 발급처에 대한 보장 및 검증은 확실하게 해야하는 경우에 사용한다. 따라서 토큰 내부에 비밀번호와 같은 값 입력 금지)
JWT 암호화 방식
- 암호화 종류
- 양방향
- 대칭키 - 이 프로젝트는 양방향 대칭키 방식 사용 : HS256
- 비대칭키
- 단방향
- 양방향
암호화 키 저장
암호화 키는 하드코딩 방식으로 구현 내부에 탑재하는 것을 지양하기 때문에 변수 설정 파일에 저장한다.
- application.properties
# 암호화 키
spring.jwt.secret=vmfhaltmskdlstkfkdgodyroqkfwkdbalroqkfwkdbalaaaaaaaaaaaaaaaabbbbb
JWTUtil
- 토큰 Payload에 저장될 정보
- username
- role
- 생성일
- 만료일
- JWTUtil 구현 메소드
- JWTUtil 생성자
- username 확인 메소드
- role 확인 메소드
- 만료일 확인 메소드
- JWTUtil : 0.12.3
package com.example.springjwt.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
public class JWTUtil {
private SecretKey secretKey;
// 암호화 키 불러오기
public JWTUtil(@Value("${spring.jwt.secret}")String secret) {
this.secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), Jwts.SIG.HS256.key().build().getAlgorithm());
}
public String getUsername(String token) {
return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().get("username", String.class);
}
public String getRole(String token) {
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());
}
public String createJwt(String username, String role, Long expiredMs) {
return Jwts.builder()
.claim("username", username)
.claim("role", role)
.issuedAt(new Date(System.currentTimeMillis()))
.expiration(new Date(System.currentTimeMillis() + expiredMs))
.signWith(secretKey)
.compact();
}
}
참고
https://devyummi.com/page?id=668d5aa4f6f909241610dca4
'Spring > Spring Security - JWT' 카테고리의 다른 글
Spring Security JWT 11 : JWT 검증 필터 (0) | 2024.12.21 |
---|---|
Spring Security JWT 10 : 로그인 성공 JWT 발급 (0) | 2024.12.21 |
Spring Security JWT 8 : DB기반 로그인 검증 로직 (1) | 2024.12.21 |
Spring Security JWT 7 : 로그인 필터 구현 (0) | 2024.12.21 |
Spring Security JWT 5 : DB 연결 및 Entity 작성 (0) | 2024.12.20 |