JWT (Json Web Token)

Gyuri Kim·2023년 4월 3일
0

cs

목록 보기
1/7

JWT

✅ JWT 개념

JWT(JSON Web Token)는 인터넷에서 정보를 안전하게 전송하기 위해 사용되는 토큰 기반의 인터넷 표정 인증 방식입니다. JWT에서는 서명된 토큰을 사용하여 인증을 진행하는 구조입니다. 공개/개인 키를 쌍으로 사용하여 토큰에 서명해, 서명된 토큰은 개인 키를 보유한 서버가 서명된 토큰을 인증하는 방식입니다.

이러한 토큰 기반의 인증 방식은 세션 기반 인증 방식과 달리 서버 측에서 상태를 유지하지 않기 때문에 서버의 확장성과 성능을 개선할 수 있습니다. JWT는 두 개체 간의 안전한 정보 교환을 위해 사용됩니다.


⚠️ 토큰 기반의 인증방식 vs 세션 기반 인증방식



✅ JWT 구성요소

JWT는 세 가지 파트로 구성됩니다. JWT는 점(.)으로 구분되어있으며, 구성요소는 아래 다음 요소와 같습니다.

  • 첫 번째 파트는 헤더(header)
    • 토큰의 유형과 사용하는 암호화 알고리즘을 지정

      {
      	"type" : "JWT",
      	"alg" : "HS512"
      }
  • 두 번째 파트는 페이로드(payload)
    • 사용자의 클레임 정보를 포함 → 클레임 : 토큰에서 사용할 정보의 조각
    • 민감한 정보를 담지 않아야 함
    • 표준 스펙상 key 이름은 3글자
      • 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 인증 과정

  • JWT 토큰을 클라이언트가 서버로 요청과 동시에 전달
  • 서버가 가지고 있는 개인 키로 signature 복호화
  • base64UrlEncode(header)가 JWT의 header 값과 일치한지, base64UrlEncode(payload)가 JWT의 payload와 일치한지 확인
  • 일치한다면 인증 허용


✅ JWT 장점

  • 세션 저장소와 같은 별도의 인증 저장소가 ‘필수적’으로 필요하지 않습니다
    • 이미 토큰 자체가 인증된 정보이기 때문입니다
  • 세션과 다르게 클라이언트의 상태를 서버가 저장해두지 않아도 됩니다
  • signature를 공통키 개인키 암호화를 통해 막아두어 데이터에 대한 보완성이 늘어납니다
  • 다른 서비스에 이용할 수 있는 공통적인 스펙으로써 사용할 수 있습니다

즉, JWT는 stateful 해야하는 세션의 단점을 보완하기 위해 만들어졌으며, JWT는별도의 세션 저장소를 강제하지 않기 때문에 stateless 하여 확장성이 뛰어나고, signature를 통한 보안성을 갖추고 있습니다.

JWT는 위와 같은 장점들과 단순한 구조와 널리 사용되는 표준으로 인해 많은 인기를 얻고 있습니다. 그러나 JWT를 사용할 때는 적절한 보안 조치를 취해야 하며, 토큰이 탈취되면 중요한 정보가 유출될 수 있기 때문에 보안에 대한 위험성도 고려해야 합니다.

따라서 JWT를 사용할 때는 적절한 암호화 알고리즘과 서명 키를 선택하고, 토큰의 만료 시간을 적절하게 설정하여 보안성을 유지해야 합니다.


⚠️ stateful vs stateless

profile
👩‍💻 IT Engineering (이사 전 블로그 : https://blog.naver.com/kgr2626 )

0개의 댓글