JWT란?

JWT(JSON Web Token) JSON 형식의 데이터를 이용해 사용자 인증 및 정보 교환을 안전하게 수행하는 토큰이다. 웹에서 사용자를 인증하고 권한을 부여하는데 주로 클라이언트와 서버 간의 정보를 안전하게 전송하는 데 사용된다.

 

JWT 구성

1. 헤더 (Header)

 - JWT의 유형 정의 및 사용하는 서명 알고리즘(SHA256 or RSA)을 지정한다.

 

2. 페이로드 (Payload)

 - 실제 데이터가 포함된 부분. 보통 사용자 정보나 기타 중요한 데이터를 포함하며, "클레임(Clame)"이라고 불리는 항목을 담고있다.

 클레임은 JWT의 세 가지 유형이 있는데, iss(발행자), exp(만료 시간), sub(주제)등을 포함한 등록된 클레임, 사용자가 정의할 수 있는 공개 클레임, 특정 애플리케이션에서만 사용하는 데이터로 사용자의 ID나 권한 정보 등이 있는 비공개 클레임이 있다. 

 

3. 서명 (Signature)

 - JWT의 데이터가 변조되지 않았음을 보장하기 위한 부분이다. 서명은 헤더와 페이로드를 결합하고, 비밀 키 또는 공개/비공개 키 쌍을 사용해 생성된다. JWT의 안전성을 보장한다.

 

JWT 형태

xxxxx.yyyyy.zzzzz

차례대로 header.payload.signature 과 같은 Base64Url 인코딩 형태로 나타낸다.

 

Base64Url 인코딩이란?

 - 표준 Base64 인코딩을 변형한 형식으로, URL과 같은 파일 경로에서 안전하게 사용하기 위해 일부 문자를 변경한 방식이다. 일반적인 Base64 인코딩은 URL이나 파일 시스템에서 사용할 수 없는 문자가 포함될 수 있는데, Base64Url은 이를 피하기 위해 몇 가지 문자를 다른 문자로 대체한다.

 Base64Url 인코딩은 JWT와 같은 웹 기반 기술에서 자주 사용되며, URL에서 안전하게 인코딩된 데이터를 전송하거나 저장할 수 있도록 돕는다. URL에서 특별한 의미를 갖는 문자인 +,/,= 가 없기 때문에 경로와 쿼리 문자열에서 그대로 사용할 수 있다.

 

JWT 인증 흐름

클라이언트와 서버를 사용하는 프로젝트에서의 JWT 인증 흐름은 다음과 같다.

  1. 로그인: 사용자가 로그인 폼에 이메일, 비밀번호 입력 시 클라이언트(React)는 이를 서버(Spring Boot)로 전송한다.
  2. JWT 생성: 서버는 사용자의 정보를 확인한 후 JWT를 생성하여 클라이언트에게 변환한다.
  3. JWT 저장: 클라이언트는 JWT를 로컬 스토리지나 세션 스토리지에 저장하고, 이후 API 요청 시 이 토큰을 Authorization 헤더에 포함하여 서버로 전송한다.
  4. JWT 검증: 서버는 요청을 처리하기 전에 JWT를 검증하여 사용자가 인증된 사용자인지 확인한다.

이러한 방식을 이용하여 Spring Boot와 React에서 JWT를 활용하여 인증 및 권한을 부여할 수 있다.