JWT(JSON Web Token)는 인터넷에서 정보를 안전하게 전송하기 위해 사용되는 토큰 기반의 인터넷 표정 인증 방식
입니다. JWT에서는 서명된 토큰을 사용하여 인증을 진행하는 구조입니다. 공개/개인 키를 쌍으로 사용하여 토큰에 서명해, 서명된 토큰은 개인 키를 보유한 서버가 서명된 토큰을 인증하는 방식입니다.
이러한 토큰 기반의 인증 방식은 세션 기반 인증 방식과 달리 서버 측에서 상태를 유지하지 않기 때문에 서버의 확장성과 성능을 개선할 수 있습니다. JWT는 두 개체 간의 안전한 정보 교환을 위해 사용됩니다.
⚠️ 토큰 기반의 인증방식 vs 세션 기반 인증방식
JWT는 세 가지 파트로 구성됩니다. JWT는 점(.)으로 구분되어있으며, 구성요소는 아래 다음 요소와 같습니다.
헤더(header)
토큰의 유형과 사용하는 암호화 알고리즘을 지정
{
"type" : "JWT",
"alg" : "HS512"
}
페이로드(payload)
iss(issuer) : 토큰 발급자
sub(subject) : 토큰 제목
aud(audience) : 토큰 대상자
exp (expiration time) : 토큰 만료 시간
nbf(not befor) : 토큰 활성 날짜
iat(issued at) : 토큰 발급 시간
jti(jwt id) : jwt 토큰 식별자 (iss 여러명일 때 구분)
{
"sub" : "1" ,
"iss" : "ori" ,
"exp" : 1511533
}
서명(signature)
즉, JWT는 stateful 해야하는 세션의 단점을 보완하기 위해 만들어졌으며, JWT는별도의 세션 저장소를 강제하지 않기 때문에 stateless 하여 확장성이 뛰어나고, signature를 통한 보안성을 갖추고 있습니다.
JWT는 위와 같은 장점들과 단순한 구조와 널리 사용되는 표준으로 인해 많은 인기를 얻고 있습니다. 그러나 JWT를 사용할 때는 적절한 보안 조치를 취해야 하며, 토큰이 탈취되면 중요한 정보가 유출될 수 있기 때문에 보안에 대한 위험성도 고려해야 합니다.
따라서 JWT를 사용할 때는 적절한 암호화 알고리즘과 서명 키를 선택하고, 토큰의 만료 시간을 적절하게 설정하여 보안성을 유지해야 합니다.
⚠️ stateful vs stateless