
[ 시작하자 ]

로그인 내부 서비스에서 토큰 생성하면 됨!
[ utils - JwtUtil 생성 ]

package shop.mtcoding.blog._core.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import shop.mtcoding.blog.user.User;
import java.util.Date;
public class JwtUtil {
//목적 : 토큰 생성
public static String create(User user) { //User user - 토큰 생성에 필요한 사용자 정보를 담고 있는 User 객체
String jwt = JWT.create()
.withSubject("blog")
.withExpiresAt(new Date(System.currentTimeMillis()+ 1000L * 60L * 60L)) //토큰 생성되고 1시간
.withClaim("id", user.getId())
.withClaim("username", user.getUsername())
.sign(Algorithm.HMAC512("metacoding")); //내가 생성하고 내가 검증하니까 RSA 필요 없음. 검증을 다른 서버가 하면 RSA쓰자. 지금은 대칭키 씀
return jwt;
}
//목적 : 검증
public static void verify() {
}
}
metacoding은 나중에 환경변수로 변경해야한다. aws했던 그 환경 변수 말하는 듯
설명
[ 목적: 사용자 정보를 기반으로 JWT 토큰을 생성 ]
1. JWT.create()로 새 JWT 빌더를 생성
2. withSubject("blog")로 토큰의 주제를 "blog"로 설정
3. 토큰의 만료 시간을 현재 시간으로부터 1시간 후로 설정
4. withClaim -> 사용자의 ID와 사용자명을 토큰에 포함시킴
5. sign(Algorithm.HMAC512("metacoding"))으로 "metacoding" 키를 사용하여
HMAC512 알고리즘으로 토큰을 서명
6. return - 생성된 JWT 토큰 문자열. return jwt;로 수정 필요
[ verify 메소드. 목적 : 입력된 토큰이 유효한지 검증하는 역할 ]
1. 토큰의 서명이 유효한지 확인
2. 토큰이 만료되지 않았는지 확인
3. 필요한 경우, 토큰의 클레임(예: 사용자 ID)이 예상과 일치하는지 확인
환경 변수 이름 변경(?) - 따라하지 마세요

null ?

env: < 이 이름은 그냥 내 마음대로 땡겨온 것임. env가 go 라고 이름 바뀌면

이렇게 따라올 수 있음


이렇게 땡겨와서 쓸 수 있음
[ 테스트 하기 ]
package shop.mtcoding.blog._core.utils;
import org.junit.jupiter.api.Test;
import shop.mtcoding.blog.user.User;
public class JwtUtilTest {
@Test
public void create_test() {
//given
User user = User.builder()
.id(1)
.username("ssar")
.build();
//when
String jwt = JwtUtil.create(user); // User 객체를 기반으로 JWT 토큰을 생성
System.out.println(jwt);
//then
}
}

이걸 붙여 넣으면 토큰 만드는 것!
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJibG9nIiwiaWQiOjEsImV4cCI6MTcxMjAzMDEyOSwidXNlcm5hbWUiOiJzc2FyIn0.gTvbYneRtwZP2-OkrJobS8NduENRmj0eIGXUCKNa_ftgwHZZUNZZOAqrSUNMYPlLVauEnyppxD1HHfsSysa2wA
[ 토큰 생성 ]

나왔다!
[ 검증하기 ]
검증하다가 터지면 Exception이 터질 것임
package shop.mtcoding.blog._core.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import shop.mtcoding.blog.user.User;
import java.util.Date;
public class JwtUtil {
//목적 : 토큰 생성
public static String create(User user) {
String jwt = JWT.create()
.withSubject("blog")
.withExpiresAt(new Date(System.currentTimeMillis()+ 1000L * 60L * 60L)) //토큰 생성되고 1시간
.withClaim("id", user.getId())
.withClaim("username", user.getUsername())
.sign(Algorithm.HMAC512("metacoding")); //내가 생성하고 내가 검증하니까 RSA 필요 없음. 검증을 다른 서버가 하면 RSA쓰자. 지금은 대칭키 씀
//metacoding은 나중에 환경변수로 변경해야한다. aws했던 그 환경변수 말하는 듯
return jwt;
}
//목적 : 검증
public static void verify(String jwt) {
DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC512("metacoding")).build().verify(jwt);
int id = decodedJWT.getClaim("id").asInt();
String username = decodedJWT.getClaim("username").asString();
}
}
검증을 통과하면 검증된 JWT에서 "id"라는 이름의 클레임(=토큰에 담긴 정보)을 추출하고,
적절한 타입으로 꺼내와서 파싱함
왜 꺼내오나요?
Share article