🔷 서버 인증 방식 문제점
🔷 JWT (JSON Web Token)
🔷 JWT 구조
.
(dot)을 이용하여 세부분으로 구성됨1. header (헤더)
{
"alg": "HS256",
"type": "JWT"
}
2. payload (내용)
등록
/ 공개
/ 비공개
가 있음. {
"sub": "1234567890",
"name": "Bzeromo",
"admin": true
}
3. signature (서명)
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload), secret)
💡 header와 payload는 base64로 인코딩되어 있다. 두 내용을 디코딩했을 때 나오는 데이터가 진짜인지 signature 파트에서 검증한다.
package com.bzeormo.board.jwt.test;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
import java.util.Date;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
public class JwtTest {
public static void main(String[] args) throws UnsupportedEncodingException, InterruptedException {
String token = Jwts.builder()
.setHeaderParam("alg", "HS256")
.setHeaderParam("typ", "JWT") //헤더완료
.claim("userId", "ssafy")
.setExpiration(new Date(System.currentTimeMillis()+3000)) //페이로드 완료
.signWith(SignatureAlgorithm.HS256, "Bzeromo".getBytes("UTF-8")) //서명완료
.compact();
// 1분 1000*60
// 1시간 1000*60*60
// 1일 1000*60*60*24
// 1년 1000*60*60*24*365
System.out.println(token);
///
System.out.println(new String(Base64.getDecoder().decode(token.split("\\.")[1])));
//3초만 유효하다고 했으니 강제로 시스템을 4초 딜레이 시키고 유효성검사를 해보자.
Thread.sleep(4000);
//유효성 검사
Jws<Claims> claims = Jwts.parser().setSigningKey("bzeromo".getBytes("UTF-8")).parseClaimsJws(token);
System.out.println(claims);
}
}
기존의 Vue 프로젝트와 스프링Api 곳곳에 코드를 수정했으나 너무 중구난방이라 설명은 깃허브에 올린 것으로 대체한다.
정보에 감사드립니다.