Skip to content

Commit

Permalink
[Feat] Jwt 토큰 발급 분리(#13)
Browse files Browse the repository at this point in the history
  • Loading branch information
sjk4618 committed May 27, 2024
1 parent e4d1f5a commit f7d80fc
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,21 @@ public enum ErrorMessage {
BLOG_NOT_MATCH_MEMBER(HttpStatus.NOT_FOUND.value(), "해당 멤버 ID에 해당하는 블로그ID가 아닙니다."),
CONTENT_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "POST ID에 해당하는 글이 존재하지 않습니다"),
MAX_BLOG_CONTENT(HttpStatus.BAD_REQUEST.value(), "블로그 글이 최대 글자 수(20)를 초과했습니다"),
JWT_UNAUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED.value(), "사용자의 로그인 검증을 실패했습니다.")

//jwt
JWT_UNAUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED.value(), "사용자의 로그인 검증을 실패했습니다."),
INVALID_ACCESS_TOKEN(HttpStatus.UNAUTHORIZED.value(), "액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요."),
EXPIRED_ACCESS_TOKEN(HttpStatus.UNAUTHORIZED.value(), "액세스 토큰이 만료되었습니다. 재발급 받아주세요."),
UNSUPPORTED_ACCESS_TOKEN(HttpStatus.UNAUTHORIZED.value(), "지원하지 않는 JWT 형식입니다."),
EMPTY_ACCESS_TOKEN(HttpStatus.UNAUTHORIZED.value(), "JWT Claim이 비어있습니다"),
JWT_SIGNATURE_EXCEPTION(HttpStatus.UNAUTHORIZED.value(), "JWT의 기존 서명과 다릅니다."),

INVALID_REFRESH_TOKEN(HttpStatus.UNAUTHORIZED.value(), "리프레시 토큰의 형식이 올바르지 않습니다."),
INVALID_REFRESH_TOKEN_VALUE(HttpStatus.UNAUTHORIZED.value(), "리프레시 토큰의 값이 올바르지 않습니다."),
EXPIRED_REFRESH_TOKEN(HttpStatus.UNAUTHORIZED.value(),"리프레시 토큰이 만료되었습니다. 다시 로그인해 주세요."),
MISMATCH_REFRESH_TOKEN(HttpStatus.UNAUTHORIZED.value(), "리프레시 토큰이 일치하지 않습니다."),


;

private final int status;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.sopt.springFirstSeminar.common.jwt;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtParser;
import lombok.RequiredArgsConstructor;
import org.sopt.springFirstSeminar.common.jwt.dto.Token;
import org.sopt.springFirstSeminar.common.jwt.dto.TokenResponse;
Expand All @@ -20,12 +21,10 @@ public Token issueTokens(final Long userId) {
jwtTokenGenerator.generateToken(userId, false));
}

public Long getUserFromJwt(String token) {
Claims claims = getBody(token);
return Long.valueOf(claims.get(USER_ID).toString());
public Long getSubject(String accessToken) {
JwtParser jwtParser = jwtTokenGenerator.getJwtParser();
return Long.valueOf(jwtParser.parseClaimsJws(accessToken)
.getBody()
.getSubject());
}




}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import io.jsonwebtoken.*;
import lombok.RequiredArgsConstructor;
import org.sopt.springFirstSeminar.common.dto.ErrorMessage;
import org.sopt.springFirstSeminar.exception.UnauthorizedException;
import org.springframework.stereotype.Component;


Expand All @@ -11,27 +13,40 @@ public class JwtTokenValidator {

private final JwtTokenGenerator jwtTokenGenerator;

public JwtValidationType validateToken(String token) {
public void validateAccessToken(String accessToken) {
try {
final Claims claims = getBody(token);
return JwtValidationType.VALID_JWT;
parseToken(accessToken);
} catch (ExpiredJwtException e) {
throw new UnauthorizedException(ErrorMessage.EXPIRED_ACCESS_TOKEN);
} catch (MalformedJwtException ex) {
return JwtValidationType.INVALID_JWT_TOKEN;
} catch (ExpiredJwtException ex) {
return JwtValidationType.EXPIRED_JWT_TOKEN;
throw new UnauthorizedException(ErrorMessage.INVALID_ACCESS_TOKEN);
} catch (UnsupportedJwtException ex) {
return JwtValidationType.UNSUPPORTED_JWT_TOKEN;
throw new UnauthorizedException(ErrorMessage.UNSUPPORTED_ACCESS_TOKEN);
} catch (IllegalArgumentException ex) {
return JwtValidationType.EMPTY_JWT;
throw new UnauthorizedException(ErrorMessage.EMPTY_ACCESS_TOKEN);
} catch (SignatureException ex) {
throw new UnauthorizedException(ErrorMessage.JWT_SIGNATURE_EXCEPTION);
}
}

private Claims getBody(final String token) {
return Jwts.parserBuilder()
.setSigningKey(jwtTokenGenerator.getSigningKey())
.build()
.parseClaimsJws(token)
.getBody();
public void validateRefreshToken(String refreshToken) {
try {
parseToken(refreshToken);
} catch (ExpiredJwtException e) {
throw new UnauthorizedException(ErrorMessage.EXPIRED_REFRESH_TOKEN);
} catch (Exception e) {
throw new UnauthorizedException(ErrorMessage.INVALID_REFRESH_TOKEN_VALUE);
}
}

public void equalsRefreshToken(String refreshToken, String storedRefreshToken) {
if (!refreshToken.equals(storedRefreshToken)) {
throw new UnauthorizedException(ErrorMessage.MISMATCH_REFRESH_TOKEN);
}
}

private void parseToken(String token) {
JwtParser jwtParser = jwtTokenGenerator.getJwtParser();
jwtParser.parseClaimsJws(token);
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package org.sopt.springFirstSeminar.common.jwt;

public enum JwtValidationType {
VALID_JWT, // 유효한 JWT
INVALID_JWT_SIGNATURE, // 유효하지 않은 서명
INVALID_JWT_TOKEN, // 유효하지 않은 토큰
EXPIRED_JWT_TOKEN, // 만료된 토큰
UNSUPPORTED_JWT_TOKEN, // 지원하지 않는 형식의 토큰
EMPTY_JWT // 빈 JWT
}
//package org.sopt.springFirstSeminar.common.jwt;
//
//public enum JwtValidationType {
// VALID_JWT, // 유효한 JWT
// INVALID_JWT_SIGNATURE, // 유효하지 않은 서명
// INVALID_JWT_TOKEN, // 유효하지 않은 토큰
// EXPIRED_JWT_TOKEN, // 만료된 토큰
// UNSUPPORTED_JWT_TOKEN, // 지원하지 않는 형식의 토큰
// EMPTY_JWT // 빈 JWT
//}

0 comments on commit f7d80fc

Please sign in to comment.