웹개발/java

JWT(JSON Web Token)란?

지구별 여행자 임탱 2024. 3. 7. 00:12
728x90

JWT(JSON Web Token)는 웹 표준(RFC 7519)으로, 두 개체 사이에서 정보를 안전하게 전송하기 위한 간결하고 독립적인 방법입니다. 

이 정보는 디지털 서명되어 있어, 검증과 신뢰성이 보장됩니다.

JWT는 크게 3 부분으로 나뉩니다:
Header: 토큰의 타입과 사용된 알고리즘을 명시하는 부분입니다.
Payload: 실제 전달하려는 데이터를 담는 부분입니다.
Signature: 토큰의 무결성을 보장하는 서명 부분입니다.
이 세 부분은 각각 base64로 인코딩되어 '.'으로 연결됩니다.

Header: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload: eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
Signature: SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c


예를 들어, 로그인 시스템에서의 JWT 사용 예시는 다음과 같습니다:
사용자가 로그인 정보(ID, Password 등)을 서버에 전송합니다.
서버는 이 정보를 검증하고, 맞다면 사용자에 대한 특정 정보(예: 사용자 ID, 이메일 등)를 payload에 넣어 JWT를 생성합니다.
이 JWT를 사용자에게 전송합니다.
사용자는 이후 요청마다 이 JWT를 포함하여 서버에 전송합니다.
서버는 JWT를 검증하고, 맞다면 요청을 처리합니다. 이를 통해 매 요청마다 로그인을 체크하지 않아도 됩니다.

 

JWT 는 주로 아래와 같은 용도로 사용됩니다:
  * 인증: 한 번 사용자가 로그인하면, 서버는 사용자에게 JWT를 발급합니다. 그 후 사용자가 서버에 요청을 할 때마다

             이 JWT를 포함해서 보냅니다. 서버는 이 JWT를 확인하여 사용자를 식별하고, 요청을 처리합니다.

             이 방식은 세션 관리를 필요로하지 않기 때문에, Stateless한 서버 구조를 가능하게 합니다.
  *  정보 교환: JWT는 정보를 안전하게 전달하는 방법입니다. 

                      JWT는 디지털 서명되어 있기 때문에, 이 정보가 중간에 변경되었는지 확인할 수 있습니다.

                      따라서 두 시스템 간에 데이터를 안전하게 교환하는 데 사용될 수 있습니다.
  *  권한 부여: JWT는 사용자가 어떤 리소스에 접근할 수 있는지 결정하는 데에도 사용될 수 있습니다. 

                      토큰에 사용자의 권한에 대한 데이터를 포함시키면, 서버는 이를 검증하여 사용자의 권한을 확인할 수 있습니다.

 

Java에서 JWT를 구현하기 위해 'java-jwt' 또는 'jjwt'와 같은 라이브러리를 사용할 수 있습니다.

 

JWT 토큰 생성 예제:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

import java.security.Key;

public class JwtExample {

    public static void main(String[] args) {

        Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);

        String jws = Jwts.builder().setSubject("Joe").signWith(key).compact();

        System.out.println("JWT Token: " + jws);
    }
}

 

JWT 토큰 검증 예제:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;

import java.security.Key;

public class JwtExample {

    public static void main(String[] args) {

        Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);

        String jws = Jwts.builder().setSubject("Joe").signWith(key).compact();

        Jws<Claims> result = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(jws);

        System.out.println("Subject: " + result.getBody().getSubject());
    }
}