(항상 잘못된 정보가 포함되어 있을수 있습니다)
(잘못된 정보가 있다면 댓글로 피드백 부탁드리겠습니다)
인증의 한 방식으로 사용되는 JWT에 대한 얘기를 인증/인가 포스팅해서 했는데
조금 더 자세하게 JWT에 대해서만 알아보려고 글을 작성해본다.
JWT는 Json Web Token의 줄임말로 JSON 객체에 인증에 필요한 정보들을 담은후 Secret Key로 암호화한 토큰으로 보통은 인증에서 많이 사용된다.
와 같은 프로세스로 이루어진다.

https://nordicapis.com/why-cant-i-just-send-jwts-without-oauth/
JWT는 Hedaer, Payload, Signature 3개로 구성되어 있다.
Header는 토큰의 타입(typ)과 사용된 알고리즘(alg)을 정의한다.
예를 들어, HS256 알고리즘은 HMAC(SHA-256)을 사용하며, RS256은 RSA 서명 알고리즘을 사용한다.
이 정보는 JWT를 검증할 때 사용되는 암호화 방식을 알려준다.
Payload는 토큰에 담을정보가 들어있다.
여기에 담는 정보의 한조각을 클레임(Claims) 이라한다.
Json(Key/Value) 형태의 한 쌍으로 구현되어 있다.
클레임의 종류는 크게 3가지로 나뉜다.
JWT 표준에서 미리 정의해 놓은 클레임 집합으로, 선택적으로 사용할 수 있다.
이 클레임들은 JWT의 운영을 보다 안전하고 효율적으로 만들기 위해 일반적인 용도로 사용된다.
주요 등록된 클레임은 다음과 같다.
iss (Issuer): 토큰을 발행한 발행자를 나타낸다.
sub (Subject): 토큰의 주제를 나타내며, 일반적으로 사용자 식별 정보가 사용된다.
aud (Audience): 토큰의 수신자를 나타낸다. 토큰이 사용될 대상이나 사용자 그룹이다.
exp (Expiration Time): 토큰의 만료 시간을 나타내며, 이 시간이 지나면 토큰은 더 이상 유효하지 않는다
nbf (Not Before): 토큰이 활성화되기 전의 시간을 나타낸다.이 시간 이전에는 토큰이 유효하지 않는다.
iat (Issued At): 토큰이 발행된 시간을 나타낸다.
jti (JWT ID): 토큰에 대한 고유 식별자로, 토큰을 유일하게 식별하는 데 사용된다.
공개 클레임은 사용자 정의 클레임으로, 공개적으로 사용되고 공유될 정보를 포함할 수 있다.
예를 들어, 사용자의 권한 레벨이나 애플리케이션에서 사용하는 다른 공개 정보 등이 이에 해당할 수 있다.
공개 클레임은 충돌이 발생하지 않도록 이름을 충분히 구별할 수 있도록 해야 한다.
충돌 방지를 위해 URI 형태로 이름을 지정할 수 있다.
비공개 클레임은 통신하는 두 당사자 간에 합의하에 사용되는 클레임으로, 사용자 정의 클레임에 해당 한다.
이 클레임들은 발행자와 수신자 즉 서버와 클라이언트만 이해하고 해석할 수 있는 정보를 포함할 수 있으며, 고유한 정보나, 애플리케이션/서비스 간의 특정한 데이터를 전달하는 데 사용된다.
예를 들어, 사용자의 고유 ID나 역할, 사용자 정의 설정 등이 비공개 클레임으로 사용될 수 있다
Signature는 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다.
Header와 Payload를 합친 후, Header에 명시된 알고리즘에 따라 서버의 SecretKey라는 비밀키로 서명한다.
이 서명을 통해 토큰이 중간에 변경되지 않았는지 검증할 수 있으며, 서명 과정에서 사용되는 비밀키 또는 공개키/개인키 쌍은 토큰의 무결성을 보장한다.
만약 JWT 토큰을 발급한후 클라이언트에서 서버로 요청을 보내는 중
중간공격자가 그 토큰을 가로챈뒤 유효기간을 늘린다던가 하는 등의 토큰을 변경하는 작업을 한 후에 Signature까지 통으로 변경한뒤에 서버로 요청을 보낸다고 가정해보자.
서버는 이를 중간공격자가 가로챈뒤에 보낸 요청이라는것을 어떻게 알 수 있을까?
이러한 공격을 피하기위해서 JWT는 SecretKey라는 것을 활용한다.
시그니쳐로 온 응답에 서버만 알고있는 secretKey를 이용해 암호화를 진행한다.
그렇게되면 중간공격자는 이 secretKey를 알지 못하고 이로인해 무결성 검사를 통과 하지 못하게된다.
이 때문에 중간공격자가 토큰을 탈취한후 유효기간등을 변경하여 Signature까지 통으로 변경 후 서버로 요청을 보내더라도 보안상 안전하게 된다.
무결성?
데이터나 정보가 정확하고 일관되며 안전하게 유지되는 상태를 의미. 데이터의 무결성은 데이터가 외부적인 손상이나 변조로부터 보호되며, 데이터가 예상대로 정확하고 신뢰할 수 있도록 보장하는 것을 목표로 함.
JWT는 JSON 포맷을 사용하여 데이터를 인코딩하므로, 어떤 프로그래밍 언어에서도 쉽게 생성하고 처리할 수 있다.
이는 다양한 시스템과 애플리케이션 간의 호환성을 보장합니다.
JWT는 필요한 모든 정보를 자체적으로 갖고 있어, 별도의 저장소 접근 없이도 토큰을 발급받는 사용자 또는 서비스가 필요한 정보를 직접 추출할 수 있다.
이는 토큰을 검증할 때 추가적인 데이터베이스 조회가 필요 없다는 의미이다.
JWT는 상태를 저장하지 않는(stateless) 방식이기 때문에 서버 측에서 사용자 세션을 관리할 필요가 없다. 이는 시스템의 확장성 측면에서 큰 이점을 제공한다.
JWT는 자가 포함적인 특성 때문에 토큰의 크기가 상대적으로 크다 그렇기 때문에 토큰안에 정보가 더 많아질수록 네트워크에 부하를 줄 수도있다.
한번 발급된 JWT는 만료 시간이 될 때까지 유효하다. 따라서 만약 토큰이 탈취되거나 유출되었다면 대처하기 어렵다.
토큰을 클라이언트에서 저장해야하기 때문에 이를 안전하게 저장하지 않으면 해킹공격에 노출될 위험이 있다.