Spring

[Spring]JWT

Young_Han 2024. 11. 8. 20:58

1. JWT란?

 JWT(Json Web Token)란 JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. 즉 토큰의 한 종류이다. 일반적으로 쿠키 저장소를 사용하여 JWT를 저장한다. 앞서 쿠키-세션 방식을 공부했는데 JWT를 사용하는 이유에 대해 알아보자.

 

클레임(Claim)은 JWT 내에서 중요한 정보를 담고 있는 부분으로, 토큰의 인증 및 권한 부여, 데이터 전달 등 여러 목적을 위해 사용된다. 이 정보는 JWT의 페이로드(payload)에 담기며, 이를 통해 시스템 간에 다양한 정보를 안전하게 공유할 수 있다.

 

2. JWT 사용 이유

 

만약 서버가 1대인 경우

1. 서버의 부하 증가

  • Session1이 모든 클라이언트의 로그인 정보를 소유하고 있다고 하자. 이후 이용자가 많을수록 서버의 부하가 늘어난다.

 

2. 서버에 클라이언트의 상태를 저장하기 떄문에 분산 환경에서 세션에 대한 정합성을 보장하기 위한 별도의 기술이 필요하다.

 

  •  만약 Client 1의 로그인 정보를 가지고 있지 않은 Sever2 나 Server3에 API 요청을 하게 되면 문제가 발생
    • 해결방법 
      • Sticky Session: 클라이언트 마다 요청 Server 고정한다.
      • 세션 저장소 생성하여 모든 세션을 저장한다.

 

3. 세션 저장소 생성

  • Session storage 가 모든 클라이언트의 로그인 정보 소유하고 있기 때문에 모든 서버에서 모든 클라이언트의 API 요청을 처리할 수 있다.

 


 

JWT 사용

 로그인 정보를 Server에 저장하지 않고, Client에 로그인 정보를 JWT로 암호화하여 저장한다.

즉 JWT를 통해 인증/인가를 처리한다. 이로인해 모든 서버에서 동일한 Secret Key를 소유한다.

 

JWT 장점

  • 서버의 확장성이 높으며 대량의 트래픽이 발생하도 대처할 수 있다.
  • 특정 DB 또는 서버에 의존하지 않아도 인증할 수 있다.
  • Client, Server가 다른 도메인을 사용할 때(OAuth) JWT Token을 사용할 수 있다.

  •  수많은 프로그래밍에서 지원된다.
    • JWT는 C, Java, Python, C++, C# 등 대부분의 주류 프로그래밍 언어에서 지원된다.

JWT  단점

  • 구현의 복잡도가 증가한다.
  • JWT에 담는 내용이 커질수록 네크워크 비용이 증가한다.
  • Secret Key 유출 시 JWT 조작이 가능하다.

 


JWT의 구성요소

 JWT는 헤더(header), 페이로드(payload), 서명(signature)으로 세 파트로 나눠져 있다.

 

헤더(header)

  • 어떤 알고리즘으로 암호화 할 것인지, 어떤 토큰을 사용할 것인지에 대한 정보가 들어있다.
{
  "alg": "HS256",
  "typ": "JWT"
}

 

 페이로드(payload)

  • 전달하려는 정보(사용자 id나 다른 데이터들, Claim이라고 부른다.)가 들어있다.
  • 페이로드에 있는 내용은 수정이 가능하며 더 많은 정보를 추가할 수 있다. 
  • JWT 발급 / 만료일 등이 명시되어 있다.
{
  "sub": "1234567890",
  "username": "영한",
  "admin": true,
  "iat": 1731065921,
  "exp": 1731067721
}

 

시그니처(signature)

  • 토큰의 무결성을 검증하고 데이터가 위조되지 않았음을 확인하는 중요한 역할을 한다.
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

 


인증 방식

1. Client가 ID/PW를 입력하여 로그인 요청

 

2. 서버에서 회원DB에 들어있는 사용자인지 확인

 

3. 확인이 되면 서버는 로그인 요청 확인 후 Secret Key를 통해 토큰 발급 후 Client에게 전달.

 

4. 서비스 요청 시 권한을 확인하기 위해 헤더에 데이터 (+JWT) 요청

 

5. 데이터를 확인하고 JWT에서 사용자 정보를 확인한다.

 

6. Client 요청에 대한 응답과 요청한 데이터를 전달해 준다.

 

 

 


액세스 토큰 (Access Token)

  • 액세스 토큰은 사용자가 특정 리소스나 서비스에 접근할 수 있는 권한을 인증 서버로부터 받은 토큰이다.
  • 액세스 토큰은 보통 짧은 수명을 가지며(예: 몇 분에서 몇 시간), 일정 시간 후에는 만료된다.
  • 짧은 수명 덕분에 보안이 강화되며, 토큰이 유출되더라도 피해를 최소화할 수 있다.

 

리프레시 토큰 (Refresh Token)

  • 액세스 토큰을 새로 발급받기 위해 사용하는 토큰이다.
  • 액세스 토큰이 만료되면 사용자에게 다시 로그인하도록 요청하는 대신, 리프레시 토큰을 이용해 새로운 액세스 토큰을 발급받을 수 있다. 이로 인해 사용자의 편의성을 높이고 불필요한 로그인 절차를 줄이는 장점이 있다.
  • 리프레시 토큰은 액세스 토큰보다 긴 수명을 가진다. (예: 며칠, 몇 주 또는 몇 달)

 

액세스 토큰과 리프레시 토큰의 사용 예시

 

  • 로그인: 사용자가 로그인하면 서버는 사용자의 인증 정보를 확인한 후, 액세스 토큰과 리프레시 토큰을 클라이언트에게 발급한다.
  • 리소스 요청: 클라이언트는 특정 리소스(예: 사용자 정보, 게시글 등)에 접근하기 위해 서버로 요청을 보낼 때 액세스 토큰을 함께 전송한다.
  • 토큰 만료: 액세스 토큰이 만료되면 서버는 요청을 거절하고, 클라이언트에게 “토큰이 만료되었습니다”라는 응답을 보낸다.
  • 리프레시 토큰 사용: 클라이언트는 기존의 리프레시 토큰을 이용해 새로운 액세스 토큰을 발급받는다. 이때 리프레시 토큰 역시 서버에 전송되며, 서버는 리프레시 토큰의 유효성을 확인한 후 새 액세스 토큰을 발급한다.
  • 갱신 완료: 클라이언트는 갱신된 액세스 토큰을 이용해 다시 서버에 요청을 보내고, 정상적인 접근이 가능해진다.

 

 

왜 분리할까?

클라이언트와 서버 간의 API 통신 중 토큰이 탈취당할 수 있기 때문이다. 따라서 액세스 토큰의 주기는 짧고 리프레시 토큰의 주기는 비교적 길다.

 

그렇다고 토큰이 완벽하게 안전한 건 아니다. 그래서 토큰에는 탈취를 당할 시 가장 쓸모없는 데이터이며 서버에서 유저(데이터)를 식별할 수 있는 것을 넣는다.

 

 


요약

1. JWT는 사용자 인증과 권한 부여를 위해 JSON 형식으로 클라이언트에 저장되는 웹 토큰이다.

2. 서버에서 세션을 저장하지 않기 때문에 서버 확장성이 높고 분산 환경에도 일관성을 유지할 수 있다.

3. 액세스 토큰과 리프레시 토큰으로 구성되어 있으며, 액세스 토큰은 짧은 수명을, 리프레시 토큰은 긴 수명을 가져 보안을 강화한다.

4. JWT는 서버에 의존하지 않아도 사용자 인증을 할 수 있지만, 토큰 크기가 커질수록 네트워크 비용이 증가할 수 있다.

 

[출처]

https://puleugo.tistory.com/138

 

우리는 왜 JWT를 사용하는가? / JWT 사용 이유

서론CS 스터디를 준비하다가 웹 보안에 대한 주제로 스터디를 진행하기로 하였다. 그 중 JWT에 대한 내용을 조사하다가 고민해본 점을 정리한다. What is JWTJSON Web Token의 준말입니다. 자바스크립트

ko.puleugo.dev

https://velog.io/@hahan/JWT%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

JWT란 무엇인가?

JWT(Json Web Token) > 정보를 비밀리에 전달하거나 인증할 때 주로 사용하는 토큰으로, Json객체를 이용함 JWT는 Json Web Token의 약자로 일반적으로 클라이언트와 서버 사이에서 통신할 때 권한을 위해

velog.io

https://velog.io/@dnjscksdn98/JWT-JSON-Web-Token-%EC%86%8C%EA%B0%9C-%EB%B0%8F-%EA%B5%AC%EC%A1%B0

 

[JWT] JSON Web Token 소개 및 구조

JSON Web Token이란? JSON Web Token (JWT) 은 웹표준 (RFC 7519) 으로서 두 개체에서 JSON 객체를 사용하여 가볍고 자가수용적인 (self-contained) 방식으로 정보를 안전성 있게 전달해주고, 사용자에 대한 속성을

velog.io