우당탕탕 개발일지

💡 JWT(JSON Web Token) 이란? 본문

Spring

💡 JWT(JSON Web Token) 이란?

kyunge_ev 2022. 12. 9. 00:05
  • JWT(JSON Web Token)
  • 당사자 간에 정보를 JSON 형태로 안전하게 전송하기 위한 토큰
    • 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미
  • URL로 이용할 수 있는 문자열로만 구성 → HTTP 구성요소 어디든 위치할 수 있음
  • 디지털 서명이 적용돼 있어 신뢰할 수 있음
  • 서버와의 통신에서 권한 인가를 위해 사용
  • JWT 기반 인증은 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방식

🌈 JWT 구조

JWT는 점(’.’)으로 구분된 아래의 세 부분으로 구성됨

출처 : https://inpa.tistory.com/

헤더(Header)

  • 검증과 관련된 내용을 담고 있음
  • 완성된 헤더는 Base64Url 형식으로 인코딩 되어 사용됨
  • 속성
    • alg : 해싱 알고리즘 지정
      • SHA256, RSA을 주로 사용하며, 토큰을 검증할 때 사용되는 서명 부분에서 사용
    • typ : 토큰의 타입 지정

내용(Payload)

  • 토큰에 담는 정보를 포함
  • 속성(클레임-Claim)
    • 등록된 클레임(Registered Claims)
      → 필수는 아니지만 토큰에 대한 정보를 담기 위해 이미 이름이 정해져 있는 클레임을 뜻함
      • iss : JWT의 발급자(Issuer) 주체
      • sub : JWT의 제목(Subject)
      • aud : JWT의 수신인(Audience)
      • exp : JWT의 만료시간(Expiration) → 시간은 NumericDate 형식으로 지정해야함
      • nbf : ‘Not Befor’
      • iat : JWT가 발급된 시간(Issued at)
      • jti : JWT의 식별자(JWT ID) → 중복 처리 방지
    • 공개 클레임(Public Claims)
      → 키 값을 마음대로 정의 할 수 있음(단, 충돌이 발생하지 않는 이름으로 정의)
    • 비공개 클레임(Private Claims)
      → 통신 간에 상호 합의되고 등록된 클레임과 공개된 클레임이 아닌 클레임을 의미

서명(Signature)

  • 인코딩된 헤더, 인코딩된 내용, 비밀키, 헤더의 알고리즘 속성값을 가져와 생성함

🌈 JWT 생성(디버거 사용)

📚 https://jwt.io/#debugger-io

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

해당 웹사이트에서 쉽게 JWT 를 생성할 수 있다.

🌈 JWT  실습

1. dependency 👉 JSON Web Token Support For The JVM

2. utils 패키지 생성 👉 JwtTokenUtil 클래스 생성

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;

public class JwtTokenUtil {
    public static String createToken(String userName, String key, long expireTimeMs) {
        Claims claims = Jwts.claims();
        claims.put("userName", userName);

        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + expireTimeMs))
                .signWith(SignatureAlgorithm.HS256, key)
                .compact();
    }
}

Claims

  • 일종의 map으로 key, value로 값을 담을 수 있음
  • .put() 으로 값 추가

IssuedAt()

  • 현재시간 세팅

Expiration

  • 현재시간 + 끝나는 시간

signwith

  • 서명