Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- java map 출력
- 노베이스부트캠프
- java기본자료형
- java set 저장
- javaJRE
- 컴파일
- java set 출력
- 격파르타합격후기
- 코딩부트캠프후기
- 격파르타장점
- java map 저장
- 비전공자sqld
- sqld자격증합격
- java참조자료형
- java list 출력
- java list 저장
- 항해99후기
- java알고리즘
- java최솟값구하기
- 프로그래머스
- javaJVM
- java map
- 격파르타후기
- 프로그래머스제일작은수
- java알고리즘문제풀이
- 항해15기
- 작은수제거하기
- 인터프린터언어
- 격파르타비전공자
- java 자료구조 활용
Archives
- Today
- Total
코딩과 결혼합니다
231024 - [Game_Crew]JWT 본문
728x90
JWT을 생성하고 검증하는 클래스
@Slf4j(topic = "JwtUtil")
@Component
public class JwtUtil {
// Header KEY 값
public static final String AUTHORIZATION_HEADER = "Authorization";
// Token 식별자
public static final String BEARER_PREFIX = "Bearer ";
// 토큰 만료시간
private final long TOKEN_TIME = 60 * 60 * 1000L; // 60분
@Value("${jwt.secret.key}") // Base64 Encode 한 SecretKey
private String secretKey;
private Key key;
private final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
- 필드 :
- AUTHORIZATION_HEADER: JWT를 포함하는 HTTP 요청의 헤더 키를 나타내는 상수
- BEARER_PREFIX: JWT를 식별하기 위한 접두사를 나타내는 상수
- TOKEN_TIME: 토큰의 만료 시간을 나타내는 변수로, 60분으로 설정
- secretKey: Base64로 인코딩된 시크릿 키 값을 저장하는 변수
- key: secretKey 값을 디코딩하여 Key 객체로 초기화
- signatureAlgorithm: JWT 서명 알고리즘으로 HS256 (HMAC with SHA-256)을 사용
@PostConstruct
public void init() {
byte[] bytes = Base64.getDecoder().decode(secretKey);
key = Keys.hmacShaKeyFor(bytes);
}
- @PostConstruct 어노테이션이 붙은 메서드로, 객체가 생성된 후에 실행된다. secretKey 값을 Base64 디코딩하여 key 변수에 할당
// 토큰 생성
public String createToken(String username) {
Date date = new Date();
return BEARER_PREFIX +
Jwts.builder()
.setSubject(username) // 사용자 식별자값(ID)
.setExpiration(new Date(date.getTime() + TOKEN_TIME)) // 만료 시간
.setIssuedAt(date) // 발급일
.signWith(key, signatureAlgorithm) // 암호화 알고리즘
.compact();
}
- 사용자 이름(username)을 받아와서 JWT 토큰을 생성한다. 발급일(issuedAt), 만료 시간(expiration), 서명 알고리즘(signatureAlgorithm) 등의 정보를 설정하여 Jwts.builder()를 사용해 토큰을 생성하고, key와 함께 서명
// header 에서 JWT 가져오기
public String getJwtFromHeader(HttpServletRequest request) {
String bearerToken = request.getHeader(AUTHORIZATION_HEADER);
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(BEARER_PREFIX)) {
return bearerToken.substring(7);
}
return null;
}
- HttpServletRequest에서 Authorization 헤더에서 JWT 값을 가져온다. "Bearer " 접두사로 시작하는 Authorization 값에서 실제 JWT 부분만 추출하여 반환
// 토큰 검증
public boolean validateToken(String token) {
try {
Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
return true;
} catch (SecurityException | MalformedJwtException | SignatureException e) {
log.error("Invalid JWT signature, 유효하지 않는 JWT 서명 입니다.");
} catch (ExpiredJwtException e) {
log.error("Expired JWT token, 만료된 JWT token 입니다.");
} catch (UnsupportedJwtException e) {
log.error("Unsupported JWT token, 지원되지 않는 JWT 토큰 입니다.");
} catch (IllegalArgumentException e) {
log.error("JWT claims is empty, 잘못된 JWT 토큰 입니다.");
}
return false;
}
// 토큰에서 사용자 정보 가져오기
public Claims getUserInfoFromToken(String token) {
return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
}
}
- validateToken(): 주어진 token이 유효한지 검증. Jwts.parserBuilder()와 key를 사용하여 서명이 올바른지, 만료되지 않았는지 등의 검사를 수행하고 예외 처리를 한다.
- getUserInfoFromToken(): 주어진 token에서 클레임(Claims) 정보(예: 사용자 이름)를 추출하여 반환
'코딩과 매일매일♥ > Game_Crew' 카테고리의 다른 글
231025 - [Game_Crew]리팩토링 : Spring Security JWT 로그인 (0) | 2023.10.25 |
---|---|
231025 - [Game_Crew]트러블슈팅 : 자동 배포 환경 구축 (0) | 2023.10.25 |
231021 - [Game_Crew]트러블 슈팅 : 지옥의 304 (1) | 2023.10.21 |
231018 - [Game_Crew]트러블슈팅 : 이메일 인증 구현하기 (0) | 2023.10.18 |
231013 - [Game_Crew] 로그인 구현 (0) | 2023.10.13 |