본문 바로가기
SpringSecurity

JWT

by 이상한나라의개발자 2023. 12. 12.

JWT (Json Web Token) 이란?

 

JSOIN Web Token(JWT) 은 인터넷 표준 (RFC 7519)으로, 두 개체 간에 정보를 JSON 객체로 안전하게 전송하기 위한 컴팩트하고 자가 정보가 포함된 방식입니다. 이 정보는 디지털 서명이 되어 있으므로 신뢰할 수 있습니다. JWT는 비밀 (HMAC 알고리즘 사용) 또는 RSA , ECDSA를 사용하는 공개 / 개인 키 쌍을 사용하여 서명할 수 있습니다.

 

  • 컴팩트함 : JWT는 URL, POST 파라미터, HTTP 헤더에 쉽게 전송될 수 있을 만큼 작아서 통신 과정에서 효율적입니다.
  • 자가 포함 : JWT는 필요한 모든 정보를 자체적으로 포함합니다. 예를들어, 사용자에 대한 신원 정보나 토큰이 발행된 시점 등을 포함할 수 있습니다.

 

쉽게 말해 당사자간 (Client 와 Server) 간에 정보를 JSON 객체롤 간결하고 안전하게 전송하기 위한 규격

 

 

구조

 

구조는 세 부분으로 구성됩니다.

 

xxxxx.yyyyy.zzzzz

 

xxxxx : 헤더(header) , yyyyy: 내용(payload), zzzzz: 서명(signature)

 

  • 헤더(Header) : 토큰의 유형(JWT)과 서명에 사용된 해시 알고리즘(예:HMA SHA256 or RSA)을 지정 합니다.
  • 페이로드(Payload) : 토큰에 포함될 클레임(claims)을 담고 있으며, 클레임은 세가지 유형으로 구분 됩니다.
    • 등록된(registered) 클레임 : 토큰에 대한 정보를 제공하는 사전 정의된 클레임 입니다.
    • 공개(public) 클레임 : 충돌을 방지하기 위해 이름을 URI 형태로 정의할 수 있는 사용자 정의 클레임 입니다.
    • 비공개(private) 클레임 : 두 개체 간에 합의하에 사용되는 사용자 정의 클레임 입니다.
  • 서명(Signature) : 헤더와 페이로드를 안전하게 인코딩하고, 서버에서 비밀 키를 사용해 서명한 부분입니다. 서버에서는 서명을 분석하여 유효한 토큰인지 검증하게 됩니다.

 

Header

 

{
	"alg":"HS256",
	"typ":"JWT"
}

 

 

Payload

 

iss : 이 데이터의 발행자를 뜻합니다.
iat : 이 데이터가 발행된 시간을 뜻합니다.
exp : 이 데이터가 만료된 시간을 뜻합니다.
sub : 토큰의 제목입니다.
aud : 토큰의 대상입니다.
nbf : 토큰이 처리되지 않아야 할 시점을 의미합니다.
이 시점이 지나기 전엔 토큰이 처리되지 않습니다.
jti : 토큰의 고유 식별자입니다.

 

 

Signature

 

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

 

 

https://jwt.io/#debugger-io

 

 

JWT는 왜 사용 할까?

 

1. 간소화된 인증

  •  JSON 형식은 XML 형식 보다 가독성이 좋은 것 뿐만 아니라 인코딩이 될 때 크기가 작아져서 HTML 및 HTTP 환경에서 데이터를 쉽게 전달할 수 있습니다.
  • JWT는 사용자 인증에 있어서 세션 기반 인증 시스템 보다 더 간단하고 효츌적입니다. 클라이언트는 JWT를 받아서 로컬에 저장하고, 이후 서버에 요청을 할 때마다 이 토큰을 함께 보내어 자신을 인증합니다. 이 방식은 서버가 사용자의 세션 상태를 유지할 필요가 없으므로 상태 없는 (Stateless) 인증 방식으로 확장성과 유연성이 뛰어 납니다.
  • 사용자 인증에 필요한 정보를 토큰에서 가지고 있기 때문에 별도의 저장소가 필요 없음
  • 다수의 서버를 운영할 때 토큰을 만들 때 사용했던 시크릿 키만 공유 되어있으면 요청을 받는 서버에서 인증 처리 가능 ( 인증 서버에 트래픽이 몰리는 문제 방지 가능 )

 

2. 보안성

  • JWT는 디지털 서명이 되어 있어, 데이터의 무결성을 보장합니다. 서버는 받은 토큰이 조작되지 않았는지 확인할 수 있으며, 이는 통신 중 정보의 안전성을 높여줍니다.

 

3. 확정성과 효율성

  • JWT는 매우 작기 때문에 HTTP 헤더에 포함시킬 수 있습니다. 이는 네트워크 통신에서의 오버헤드를 줄이고, 서버와 클라이언트 간의 효율적인 데이터 교환이 가능해 집니다.

 

4. 언어 및 플랫폼 독립적

  • JWT는 JSON 형식을 사용하여 다양한 프로그래밍 언어와 플랫폼에서 쉽게 생성화고 처리할 수 있어서 다양한 시스템 간의 호환성을 높여줍니다.

 

5. 크로스 도메인 인증

  • JWT는 CORS(Cross-Origin Resource Sharing) 이슈에 영향을 받지 않습니다.

 

6. 자가 포함 구조 

  • JWT는 필요한 모든 정보를 자체적으로 포함하고 있어, 매 요청마다 서버가 데이터베이스에 접근하여 사용자 정보를 조회할 필요가 없습니다. 이는 서버의 부하를 줄이고, 성능을 향상 시킵니다.

 

7. 모바일 환경과의 호환성

  • 모바일 앱과 같은 클라이언트 사이드 어플리케이션에서는 JWT를 사용하여 효과적으로 인증을 관리할 수 있습니다. 세션 기반 인증보다 간단하여 모바일 환경에서의 사용성을 높여줍니다.

 

JWT 사용 과정 

 

1. 사용자가 인증을 요청 ( 로그인 등 )

2. 서버는 사용자의 정보를 기반으로 JWT 를 생성하고, 이를 사용자에게 반환

3. 사용자는 이후의 요청에서 전달 받은 JWT 토큰을 서버로 전송하여 자신을 인증

4. 서버는 JWT 토큰의 서명(Signature -> Header + Payload)을 검증하고 유효하다면 요청을 처리

 

 

JWT 사용과정

 

'SpringSecurity' 카테고리의 다른 글

인가  (0) 2023.12.12
인증 FormLogin  (0) 2023.12.12