JWT? JWT!

김희영·2025년 9월 19일

토막개발지식

목록 보기
12/27

JWT

JSON Web Token.
Json 객체에 인증 관련 정보들을 담은 후 비밀키로 서명한 토큰

존맛탱이 아니다

왜 JWT를 쓸까?
1. apiKey에는 의미 있는 정보가 없다.
2. 인증 작업은 거의 모든 요청에서 발생한다.

-> 매번 DB 조회를 해야함. 즉... 오래 걸린다!
그렇다면 JWT에 위조 방지 기술+ 인증 데이터를 넣어 인증을 빠르게 해보자!
(JWT로 accessToken 만들자는 소리)

+) JWT의 구조 : header + valid payload + signature
	- header : alg(암호화 알고리즘), typ (토큰 타입)
	- valid payload : claims 값들 (데이터) 
	- signature : payload+secret key

signature로 진위를 판별한다.

설치 (build.gradle)

implementation("io.jsonwebtoken:jjwt-api:0.12.6")
    runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.6")
    runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.6")

토큰 생성

String jwt = Jwts.builder()
                .claims(Map.of("필드명1", "필드값1", "필드명2", 필드값2)) // 내용
                .issuedAt(issuedAt) // 생성날짜 (Date)
                .expiration(expiration) // 만료날짜
                .signWith(secretKey) // 키 서명
                .compact();

claims: 토큰에서 사용하는 정보. map으로 생성

여기서 만료일/claims/시크릿 키는 필수다.

참고로 Map->JWT 직렬화고 그 반대는 역직렬화

//역직렬화
 (Map<String, Object>) Jwts
                        .parser()
                        .verifyWith(secretKey)
                        .build()
                        .parse(jwt)
                        .getPayload();

JMT 인증 결과

1) 인증 성공
2) 인증 실패
3) 토큰 만료

여기서 문제! 만약 토큰을 탈취당하면?
-> 그냥 산다. 토큰 만료 기간을 짧게 잡아두면 좋을듯~

그러니까 리프레시 토큰이 필요한 것!

profile
내는 반드시 개발자가 되고 말것어

0개의 댓글