[ 시작하자 ]
로그인 내부 서비스에서 토큰 생성하면 됨!
[ 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