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 인증 흐름은 다음과 같다.
- 로그인: 사용자가 로그인 폼에 이메일, 비밀번호 입력 시 클라이언트(React)는 이를 서버(Spring Boot)로 전송한다.
- JWT 생성: 서버는 사용자의 정보를 확인한 후 JWT를 생성하여 클라이언트에게 변환한다.
- JWT 저장: 클라이언트는 JWT를 로컬 스토리지나 세션 스토리지에 저장하고, 이후 API 요청 시 이 토큰을 Authorization 헤더에 포함하여 서버로 전송한다.
- JWT 검증: 서버는 요청을 처리하기 전에 JWT를 검증하여 사용자가 인증된 사용자인지 확인한다.
이러한 방식을 이용하여 Spring Boot와 React에서 JWT를 활용하여 인증 및 권한을 부여할 수 있다.
'공부' 카테고리의 다른 글
HTTP 쿠키&세션 개념 및 Spring Security + React 로그인 구현 방법 (0) | 2025.02.06 |
---|---|
웹 서버(Web Server) - React + nginx (0) | 2025.01.20 |