inblog logo
|
하쎄의 기술 일기장
    springboot

    JWT 이해하기

    JsonWebToken(JWT)
    하세연's avatar
    하세연
    Sep 26, 2024
    JWT 이해하기
    Contents
    1. 암호화2. JWT(Json Web Token)3. JWT 생성하기4. JWT 검증5. JWT 장점

    1. 암호화

    1) 단방향 (Encoding 만 가능) → 서명, 위조 검증

     

    2) 양방향 (Encoding Decoding 가능)

    • 대칭키 (열쇠가 하나) - 생성과 검증을 한놈이 할때
    • 공개키 (열쇠가 쌍으로 두개) - 생성과 검증을 다른놈이 할때
     

    3) Base64

    • 아스키코드 8bit → 2의 8승 → 경우의 수가 256
    • Base64 6bit → 2의 6승 → 경우의 수가 64 - 양방향 - 누구나 복호화 할 수 있다.
    • 파일이나 사진이나 이런것들을 문자화해서 전송하기 위해서!!
    • JSON에 사진을 심어서 함께 전송할 수 있다.
     

    2. JWT(Json Web Token)

    💡
    JWT(Json Web Token)는 두 시스템 간에 안전하게 정보를 전송하기 위한 개방형 표준(RFC 7519)입니다. 일반적으로 인증 및 권한 부여 목적으로 사용됩니다. JWT는 세 부분으로 구성된 문자열로, 점(.)으로 구분되어 있습니다:
    • 헤더(Header): JWT의 타입과 사용된 서명 알고리즘을 정의합니다. 보통 다음과 같이 구성됩니다:
      • { "alg": "HS256", "typ": "JWT" }
    • 페이로드(Payload): 클레임(Claims)이라고 불리는 실제 전송되는 데이터를 포함합니다. 페이로드에는 표준 클레임과 사용자 정의 클레임을 포함할 수 있습니다. 예를 들어:
      • { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
        이 클레임은 sub(주체), name(사용자 이름), iat(발행 시간) 등을 포함할 수 있습니다.
    • 서명(Signature): 서명은 헤더와 페이로드를 결합하고, 비밀키를 이용하여 서명 알고리즘(예: HMAC, RSA, ECDSA)을 통해 생성됩니다. 이를 통해 토큰의 무결성을 보장합니다. 서명은 다음과 같이 생성됩니다:
      • HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
    쉽게 말해, JWT는 다음과 같이 Header, payload, verify signature 세부분으로 나뉘게 된다.
    Header는 해쉬방식, Payload는 정보 그리고 Signature에는 시크릿키가 들어가게 된다.
    notion image
    이를 https://jwt.io/ 에 들어가서 확인할 수 있다.
    왼쪽의 Encoded가 암호화된 JWT이고, 오른쪽이 토큰에 담겨져 있는 정보들이다.
    notion image

    3. JWT 생성하기

    public class JWTutil { public static String create(User user){ String accessToken = JWT.create() .withSubject("바보") .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7)) // 만료기간 .withClaim("id", user.getId()) // payLoad .withClaim("username", user.getUsername()) .sign(Algorithm.HMAC512("metacoding")); // Header의 알고리즘 + 시그니쳐 return accessToken; } }
     

    4. JWT 검증

    public static User verify(String jwt){ DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC512("metacoding")).build().verify(jwt); int id = decodedJWT.getClaim("id").asInt(); String username = decodedJWT.getClaim("username").asString(); return User.builder() .id(id) .username(username) .build(); }
     

    5. JWT 장점

    💡
    1. 서버 상태 유지 필요 없음: JWT는 클라이언트 측에 저장되므로, 별도의 세션 관리를 하지 않고도 사용자 정보를 유지할 수 있습니다.
    1. 스케일링에 유리: JWT는 서버의 상태를 유지하지 않기 때문에, 여러 서버에서 인증을 처리하는 분산 시스템에서 유리합니다.
    1. 데이터 자가 포함: JWT 페이로드에 본 글 목록과 같은 데이터를 쉽게 포함할 수 있어, 추가적인 데이터베이스 호출이 불필요할 수 있습니다.

    JWT를 사용하는 경우 고려할 점

    • JWT 크기 제한: JWT의 크기가 커질 수 있기 때문에, 너무 많은 데이터를 페이로드에 담으면 비효율적일 수 있습니다. 본 글 목록이 너무 많아지면 데이터베이스로 관리하는 것이 나을 수 있습니다.
    • 보안: JWT는 인코딩된 형태로 클라이언트에 저장되지만, 암호화된 것은 아닙니다. 따라서 민감한 정보는 JWT에 직접 저장하지 말고, JWT 서명을 통해 무결성을 보장하는 방식으로 관리해야 합니다.
     
    Share article

    하쎄의 기술 일기장

    RSS·Powered by Inblog