[Spring] JWT

young-gue Park·2023년 11월 15일
0

Spring

목록 보기
13/14
post-thumbnail

⚡ JWT


📌 JWT

🔷 서버 인증 방식 문제점

  • 세션 : 로그인 유저의 수가 많아 지면 서버에 저장해야 할 정보가 많아짐
  • 확장성 : 여러 개의 프로세스를 돌리거나, 여러 대의 서버 컴퓨터를 추가 하는 과정이 복잡하고 어려움
  • CORS (Cross-Origin Resource Sharing)

🔷 JWT (JSON Web Token)

  • JWT는 정보를 JSON의 형태로 안전하게 전송하기 위한 웹 표준(RFC7519)
  • 디지털 서명이 되어 있으므로 신뢰할 수 있음.
  • 암호화 알고리즘을 사용.
  • JWT 자체가 필요한 모든 정보를 갖고 있기 때문에 검증하기 위해 다른 검증 수단이 필요하지 않음.
  • 권한을 부여하거나, 정보를 교환할 때 등의 상황에서 사용 가능

🔷 JWT 구조

  • JWT는 .(dot)을 이용하여 세부분으로 구성됨

1. header (헤더)

  • 일반적으로 토큰의 유형과 사용중인 암호 알고리즘으로 구성
{
	"alg": "HS256",
	"type": "JWT"
}

2. payload (내용)

  • claim을 포함한 payload 작성
  • claim은 사용자 및 추가 데이터를 의미하며 등록 / 공개 / 비공개 가 있음.
{
	"sub": "1234567890",
	"name": "Bzeromo",
	"admin": true
}

3. signature (서명)

  • 해당 토큰이 조작되었거나 변경되지 않음을 확인하는 용도로 사용.
  • Header와 Payload의 인코딩 값을 더하고, 비밀 키로 암호화 알고리즘을 통해 해쉬 값을 생성
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);
		
	}
}

Day12_JWT 깃허브


기존의 Vue 프로젝트와 스프링Api 곳곳에 코드를 수정했으나 너무 중구난방이라 설명은 깃허브에 올린 것으로 대체한다.

profile
Hodie mihi, Cras tibi

1개의 댓글

comment-user-thumbnail
2023년 11월 15일

정보에 감사드립니다.

답글 달기