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로 진위를 판별한다.
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();
1) 인증 성공
2) 인증 실패
3) 토큰 만료
여기서 문제! 만약 토큰을 탈취당하면?
-> 그냥 산다. 토큰 만료 기간을 짧게 잡아두면 좋을듯~
그러니까 리프레시 토큰이 필요한 것!