JWT(JSON Web Token)는 웹 애플리케이션에서 사용자 인증과 데이터 교환을 위해 널리 사용되는 표준화된 방법이다. JWT는 주로 사용자 인증을 위해 사용된다. 인증된 사용자가 서버와 클라이언트 간에 안전하게 데이터를 주고받을 수 있도록 도와준다.
JWT의 기본 구조
JWT는 세 부분으로 구성된 문자열로, 각 부분은 마침표('.')로 구분된다.
Header (헤더)
헤더에는 JWT의 유형(type)과 해싱 알고리즘(alg)이 명시된다.
{
"alg": "HS256",
"typ": "JWT"
}
- 여기서 alg는 서명을 생성할 때 사용하는 알고리즘을 나타내고, typ는 토큰의 유형을 나타내는데, 보통 "JWT"로 설정된다.
- 역할: 헤더는 토큰이 어떻게 서명되었는지 알려줘. 주로 HMAC, RSA, ECDSA와 같은 알고리즘이 사용된다.
Payload (페이로드)
페이로드에는 실제로 담고 싶은 정보(claims)가 포함된다. 이 정보는 사용자 식별 정보, 만료 시간, 발행자 등일 수 있다.
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
여기서 sub은 사용자 ID를 나타내고, name은 사용자 이름, iat는 토큰 발행 시간을 Unix 타임스탬프로 나타낸다.
역할: 페이로드는 사용자와 관련된 데이터를 담고, 이 데이터는 서버가 사용자를 인증하거나 정보를 확인할 때 사용된다.
Claim의 유형:
- Registered Claims: JWT에 권장되는 예약된 클레임. 예를 들면, iss (발행자), exp (만료 시간), sub (주제), aud (대상) 등이 있다.
- Public Claims: 공공 클레임으로, 사용자 정의 클레임이 될 수 있다. 예를 들어, 사용자 이름, 이메일 주소 등.
- Private Claims: 특정 애플리케이션에서 사용하기 위해 정의된 클레임으로, 서버와 클라이언트 간에 동의한 정보이다.
Signature (서명)
서명은 헤더와 페이로드를 인코딩한 후, 비밀키를 사용해 서명한 값이다.
과정:
- 헤더와 페이로드를 각각 Base64Url로 인코딩한다.
- 그 둘을 합쳐서 마침표로 구분된 문자열로 만든 후, 비밀키를 이용해 서명한다.
- 서명된 결과는 토큰의 마지막 부분에 추가된다.
역할: 서명은 JWT의 무결성을 보장한다. 서명이 일치하지 않으면 토큰이 위조되었거나 변조되었음을 의미한다.
Ex) 예를 들어 HMAC SHA256 알고리즘을 사용할여는 경우 서명은 다음과 같은 방식으로 생성된다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
서명은 메시지가 전송 도중 변경되지 않았는지 확인하는 데 사용되며, 개인 키로 서명된 토큰의 경우 JWT를 보낸 사람이 주장한 본인인지 확인이 가능하다.
즉 JWT는 간단한 문자열로 구성되어 있어서 HTTP와 같은 웹 환경에서 쉽게 주고받을 수 있다. 반면에, SAML 같은 XML 기반 방식은 구조가 복잡하고 길어서 데이터가 더 커지기 때문에 상대적으로 비효율적이다. 그래서 JWT가 더 간결하고, 사용하기 편리하다.
2. JWT의 작동 원리
JWT는 주로 사용자가 로그인할 때 생성된다. 그 후, 클라이언트는 이 토큰을 저장(보통 로컬 스토리지나 쿠키에 저장)하고, 이후 요청할 때마다 이 토큰을 서버에 함께 보냄으로써 인증을 유지할 수 있다.
- 사용자 로그인: 사용자가 ID와 비밀번호로 로그인을 하면, 서버는 사용자의 신원을 확인하고, JWT를 생성한다.
- JWT 발급: 생성된 JWT는 클라이언트에게 전달된다.
- 토큰 저장: 클라이언트는 JWT를 로컬 스토리지 또는 쿠키에 저장한다.
- 인증된 요청: 이후 클라이언트는 서버에 요청을 보낼 때마다 HTTP 헤더에 JWT를 포함시켜 보낸다. 서버는 이 토큰을 검사해 사용자가 인증된 상태인지 확인한다.
- 서명 확인: 서버는 JWT의 서명을 검증해 토큰이 변조되지 않았는지 확인한다. 만약 서명이 일치하지 않으면 요청을 거부한다.
3. JWT의 장점
- 자기 포함적: JWT는 필요한 정보를 모두 포함하고 있어서, 서버는 별도의 데이터베이스 조회 없이 토큰만으로 사용자를 식별할 수 있다.
- 확장성: JWT는 클라이언트와 서버 간의 상태를 유지하지 않아도 되기 때문에, 서버 확장이 용이한다.
- 다양한 플랫폼 지원: JWT는 다양한 언어와 플랫폼에서 사용 가능해, 즉 호환성이 좋다.
4. JWT의 단점
- 크기: JWT는 페이로드에 정보가 많이 담길수록 크기가 커지기 때문에, 요청 시 트래픽이 늘어날 수 있다.
- 보안: JWT가 클라이언트에 저장되기 때문에, 토큰이 유출될 경우 문제가 발생할 수 있다. 이를 방지하기 위해 HTTPS를 사용하고, 민감한 정보를 페이로드에 포함시키지 않는 것이 중요하다.
- 무효화 어려움: JWT는 발급된 이후에는 서버가 특정 토큰을 무효화하기 어려워한다. 이를 해결하려면 블랙리스트를 관리하거나 토큰의 유효기간을 짧게 설정하는 방법이 필요한다.
5. JWT의 실제 사용 예
- 사용자 인증: 웹 애플리케이션에서 사용자가 로그인한 후, JWT를 발급받아 이후의 모든 요청에 사용한다.
- 정보 교환: 서로 신뢰할 수 있는 두 파티 간에 데이터를 교환할 때, JWT를 사용해 데이터를 안전하게 전달할 수 있다.
'Web지식 > 네트워크' 카테고리의 다른 글
Http/1.0 ~http/3 (0) | 2024.08.24 |
---|---|
쿠키(Cookie)와 세션(Session) (0) | 2024.08.21 |
DispatcherServlet (0) | 2024.08.13 |
Ajax란? (0) | 2024.08.04 |