본문 바로가기
HTTP & 네트워크 기초

JWT (JSON Web Token)

by TechExplorer 2023. 3. 5.

JWT (JSON Web Token)

JWT는 인증과 인가를 위한 개방형 표준으로서, JSON 포맷으로 구성된 Web Token입니다. JWT는 암호화된 문자열로 사용자 정보를 인증할 수 있는 기술로, OAuth 및 OpenID Connect 등의 인증 프로토콜에서 사용됩니다. 이번 글에서는 JWT의 개념, 구성, 그리고 사용 방법에 대해 살펴보겠습니다.


JWT란?

JWT는 JSON Web Token의 약자입니다. JSON 포맷으로 작성된 Web Token으로, 사용자 정보를 인증할 수 있는 기술입니다. JWT는 Header, Payload, Signature의 세 부분으로 구성되어 있으며, 각 부분은 Base64 인코딩되어 문자열로 표현됩니다.

 

JWT는 사용자가 인증된 후 서버로부터 발급받게 되며, 이후에는 JWT를 가지고 요청을 보내면 서버에서는 JWT의 유효성을 검증하여 인증을 처리합니다. JWT는 서버에 저장할 필요가 없기 때문에 서버 부하를 줄일 수 있으며, 사용자의 인증 정보를 안전하게 전달할 수 있습니다.

 

JWT는 OAuth 및 OpenID Connect와 같은 인증 프로토콜에서 사용되며, 사용자가 다른 서비스에서 인증을 받아와서 해당 서비스에서 JWT를 발급받을 수도 있습니다. 이러한 기술은 다양한 웹 어플리케이션에서 사용되며, 최근에는 모바일 앱에서도 사용되는 추세입니다.

 

JWT의 구성 요소는 Header, Payload, Signature로 구성되어 있습니다. Header는 JWT가 어떤 종류인지를 나타내는 부분이며, Payload는 JWT에 담길 정보를 나타내는 부분입니다. Signature는 JWT의 유효성을 검증하는 부분입니다.

 

JWT는 암호화되어 있기 때문에 중간에 탈취될 경우에도 사용자의 정보를 보호할 수 있습니다. 또한, JWT는 브라우저의 쿠키와 달리 동일 출처 정책(Same Origin Policy)을 강제하지 않으므로, CORS(Cross-Origin Resource Sharing) 문제를 해결할 수 있습니다.

 

이상으로 JWT의 개념에 대해 살펴보았습니다. 다음으로는 JWT의 구성 요소와 작동 방식에 대해서 자세히 살펴보겠습니다.


JWT의 구성 요소

JWT는 Header, Payload, Signature의 세 부분으로 구성되어 있습니다. 각 부분은 Base64 인코딩되어 문자열로 표현됩니다.

 

● Header

 

Header는 JWT가 어떤 종류인지를 나타내는 부분입니다. Header는 다음과 같이 구성되어 있습니다.

 

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

 

여기서 "alg"는 암호화 알고리즘을 나타내며, "typ"은 토큰의 타입을 나타냅니다.

 

● Payload

 

Payload는 JWT에 담길 정보를 나타내는 부분입니다. Payload는 다음과 같이 구성되어 있습니다.

 

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

 

여기서 "sub"는 사용자의 ID를 나타내며, "name"은 사용자의 이름을 나타냅니다. "iat"는 토큰이 발급된 시간을 나타냅니다.

 

Payload는 사용자가 필요로 하는 정보를 포함할 수 있습니다. 예를 들어, 사용자의 권한, 이메일 주소, 전화번호 등을 포함할 수 있습니다.

 

● Signature

 

Signature는 JWT의 유효성을 검증하는 부분입니다. Signature는 다음과 같이 구성되어 있습니다.

 

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

 

여기서 HMACSHA256은 암호화 알고리즘입니다. 이 알고리즘을 사용하여 Header와 Payload를 합친 문자열과 서버에서 사용하는 Secret Key를 이용해 암호화합니다.

 

위에서 살펴본 것처럼, JWT는 Header, Payload, Signature의 세 부분으로 구성되어 있습니다. 이들을 Base64 인코딩하여 하나의 문자열로 만든 후, "."으로 구분하여 전송합니다. 서버에서는 받은 문자열을 다시 디코딩하여 각 부분을 확인한 후, Signature를 검증하여 유효성을 판단합니다.

 

이상으로 JWT의 구성 요소에 대해 살펴보았습니다. 다음으로는 JWT의 작동 방식에 대해서 자세히 살펴보겠습니다.


JWT의 작동 방식

JWT는 인증과 인가를 처리하는 데에 사용됩니다. 일반적으로 사용자가 로그인에 성공하면, 서버에서 JWT를 발급받게 됩니다. 그리고 이후에는 JWT를 가지고 서버에 요청을 보내게 되며, 서버에서는 JWT의 유효성을 검증하여 인증을 처리합니다.

 

● 인증 과정

 

사용자가 로그인에 성공하면, 서버에서 JWT를 발급받게 됩니다. 이때 JWT는 Base64 인코딩된 문자열로서, Header, Payload, Signature의 세 부분으로 구성됩니다.

 

서버에서는 JWT를 발급할 때, Payload에 필요한 사용자 정보를 포함시킵니다. 이후에는 사용자가 서버에 요청을 보낼 때마다, 서버에서는 JWT의 유효성을 검증하여 사용자의 인증 여부를 판단합니다.

 

● 인가 과정

 

JWT는 인증 외에도 인가에도 사용됩니다. 사용자의 인증 정보를 포함하고 있으므로, 서버에서는 JWT를 검증한 후 해당 사용자가 요청한 작업을 수행할 수 있는지 여부를 판단할 수 있습니다.

 

예를 들어, 사용자가 글을 작성하려고 할 때, 서버에서는 해당 사용자가 글 작성 권한을 가지고 있는지 검증한 후, JWT를 이용하여 인가를 처리합니다.

 

JWT는 유효한 기간이 있으며, 만료 기간이 지나면 JWT는 더 이상 유효하지 않습니다. 이 경우, 사용자는 다시 로그인을 해야하며, 서버에서는 새로운 JWT를 발급받게 됩니다.

 

이상으로 JWT의 작동 방식에 대해 살펴보았습니다. 다음으로는 JWT의 장단점에 대해서 자세히 살펴보겠습니다.


JWT의 장단점

JWT는 인증과 인가를 처리하는 데에 사용되는 기술입니다. 이번에는 JWT의 장단점에 대해 살펴보겠습니다.

 

● 장점

 

  1. Stateless
    JWT는 서버에 상태 정보를 저장하지 않습니다. 따라서 서버에 저장할 필요가 없어서 서버의 부하를 줄일 수 있습니다.
  2. 보안
    JWT는 암호화되어 있기 때문에 중간에 탈취될 경우에도 사용자의 정보를 보호할 수 있습니다. 또한, JWT는 브라우저의 쿠키와 달리 동일 출처 정책(Same Origin Policy)을 강제하지 않으므로, CORS(Cross-Origin Resource Sharing) 문제를 해결할 수 있습니다.
  3. 확장성
    JWT는 JSON 포맷으로 되어 있어서, 사용자가 필요한 정보를 포함할 수 있습니다. 또한, JWT는 OAuth 및 OpenID Connect와 같은 인증 프로토콜에서 사용되므로, 다양한 웹 어플리케이션에서 사용될 수 있습니다.

 

● 단점

 

  1. Payload 크기 제한
    JWT는 URL 또는 HTTP 헤더를 통해 전송되기 때문에, Payload 크기가 제한됩니다. 이는 사용자 정보가 많은 경우 문제가 될 수 있습니다.
  2. 탈취되면 안전하지 않음
    JWT가 탈취될 경우에는 해당 JWT를 사용하여 인증을 처리할 수 있는 문제가 있습니다. 따라서 JWT를 사용할 경우에는 반드시 보안 강화를 해야 합니다.

 

이상으로 JWT의 장단점에 대해 살펴보았습니다. 다음으로는 JWT의 사용 예시에 대해서 자세히 살펴보겠습니다.


JWT의 사용 예시

JWT는 OAuth 및 OpenID Connect와 같은 인증 프로토콜에서 사용되며, 다양한 웹 어플리케이션에서도 사용됩니다. 이번에는 JWT의 사용 예시를 살펴보겠습니다.

 

● OAuth 2.0 인증 방식

 

OAuth 2.0은 서비스 제공자와 사용자의 인증을 처리하는 데에 사용되는 프로토콜입니다. OAuth 2.0에서는 JWT를 사용하여 사용자 인증 정보를 전달합니다. 이때 JWT는 access token이라는 이름으로 사용됩니다.

 

서비스 제공자는 access token을 발급받은 후, 사용자가 해당 서비스에 요청을 보낼 때마다 access token을 이용하여 인증을 처리합니다.

 

● OpenID Connect

 

OpenID Connect는 OAuth 2.0을 기반으로 하는 인증 프로토콜입니다. OpenID Connect에서는 JWT를 사용하여 사용자 정보를 전달합니다.

 

사용자가 로그인에 성공하면, 서버에서 JWT를 발급받게 됩니다. 이후에는 사용자가 요청을 보낼 때마다, JWT를 이용하여 인증을 처리합니다.

 

JWT는 OAuth 및 OpenID Connect와 같은 인증 프로토콜에서 사용될 뿐만 아니라, 다양한 웹 어플리케이션에서도 사용됩니다. 예를 들어, 모바일 앱에서도 JWT를 사용하여 사용자 인증을 처리할 수 있습니다.

 

이상으로 JWT의 사용 예시에 대해 살펴보았습니다. 다음으로는 JWT의 보안 이슈와 보안 강화 방안에 대해서 자세히 살펴보겠습니다.


JWT의 보안 이슈

JWT는 인증과 인가를 처리하는 데에 사용되는 기술입니다. 그러나 JWT를 사용할 때에는 보안 이슈에 대해 고려해야 합니다. 이번에는 JWT의 보안 이슈에 대해 살펴보겠습니다.

 

● JWT의 탈취

 

JWT가 탈취될 경우에는 해당 JWT를 사용하여 인증을 처리할 수 있는 문제가 있습니다. 따라서 JWT를 사용할 경우에는 반드시 보안 강화를 해야 합니다.

 

  1. JWT를 HttpOnly 쿠키로 전송
    JWT를 HttpOnly 쿠키로 전송하면, XSS(Cross-Site Scripting) 공격으로부터 JWT를 보호할 수 있습니다.
  2. HTTPS 사용
    HTTPS를 사용하면, JWT를 전송할 때 암호화하여 중간에 탈취될 경우에도 사용자의 정보를 보호할 수 있습니다.
  3. 만료 기간 설정
    JWT는 만료 기간이 있습니다. 이 기간을 설정하면, 만료된 JWT를 사용할 수 없도록 처리할 수 있습니다.

 

● JWT의 Payload 크기 제한

 

JWT는 URL 또는 HTTP 헤더를 통해 전송되기 때문에, Payload 크기가 제한됩니다. 이는 사용자 정보가 많은 경우 문제가 될 수 있습니다. 이를 해결하기 위해서는 필요한 정보만을 포함시키고, 다른 정보는 서버에 저장하여 필요할 때마다 사용하는 방법을 고려할 수 있습니다.

 

● Signature 검증

 

JWT의 Signature는 서버에서 검증되어야 합니다. 만약 Signature가 검증되지 않은 JWT를 사용하게 되면, 인증이 무효화됩니다.

 

이상으로 JWT의 보안 이슈에 대해 살펴보았습니다. JWT를 사용할 때에는 보안 이슈에 대해 고려하며, 보안 강화를 통해 사용자의 정보를 안전하게 보호해야 합니다.


JWT의 보안 강화 방안

JWT는 인증과 인가를 처리하는 데에 사용되는 기술입니다. 그러나 JWT를 사용할 때에는 보안 이슈에 대해 고려해야 합니다. 이번에는 JWT의 보안 강화 방안에 대해 살펴보겠습니다.

 

  • HttpOnly 쿠키 사용
    JWT를 HttpOnly 쿠키로 전송하면, XSS(Cross-Site Scripting) 공격으로부터 JWT를 보호할 수 있습니다. HttpOnly 쿠키는 JavaScript를 통해 쿠키에 접근하는 것을 막습니다.
  • HTTPS 사용
    HTTPS를 사용하면, JWT를 전송할 때 암호화하여 중간에 탈취될 경우에도 사용자의 정보를 보호할 수 있습니다.
  • 만료 기간 설정
    JWT는 만료 기간이 있습니다. 이 기간을 설정하면, 만료된 JWT를 사용할 수 없도록 처리할 수 있습니다.
  • Payload 크기 제한
    JWT는 URL 또는 HTTP 헤더를 통해 전송되기 때문에, Payload 크기가 제한됩니다. 이를 해결하기 위해서는 필요한 정보만을 포함시키고, 다른 정보는 서버에 저장하여 필요할 때마다 사용하는 방법을 고려할 수 있습니다.
  • Signature 검증
    JWT의 Signature는 서버에서 검증되어야 합니다. 만약 Signature가 검증되지 않은 JWT를 사용하게 되면, 인증이 무효화됩니다. 서버에서는 JWT의 Signature를 검증하여 유효성을 판단해야 합니다.
  • Secret Key 보안 강화
    JWT의 Signature는 Secret Key를 이용하여 암호화됩니다. 따라서 Secret Key의 보안을 강화하는 것이 중요합니다. Secret Key는 외부에서 접근할 수 없도록 보안을 강화해야 합니다.

 

이상으로 JWT의 보안 강화 방안에 대해 살펴보았습니다. JWT를 사용할 때에는 보안 이슈에 대해 고려하며, 보안 강화를 통해 사용자의 정보를 안전하게 보호해야 합니다.


JWT는 인증과 인가를 처리하는 데에 사용되는 기술입니다. JWT를 사용하면, 서버에 상태 정보를 저장하지 않아서 서버의 부하를 줄일 수 있으며, 다양한 웹 어플리케이션에서도 사용됩니다.

 

그러나 JWT를 사용할 때에는 보안 이슈에 대해 고려해야 합니다. JWT의 보안 강화 방안으로는 HttpOnly 쿠키 사용, HTTPS 사용, 만료 기간 설정, Payload 크기 제한, Signature 검증, Secret Key 보안 강화 등이 있습니다.

 

JWT는 OAuth 및 OpenID Connect와 같은 인증 프로토콜에서 사용될 뿐만 아니라, 다양한 웹 어플리케이션에서도 사용됩니다. JWT를 사용하면, 서버의 부하를 줄일 수 있으며, 사용자 정보를 보호할 수 있습니다.

 

이상으로 JWT에 대해 살펴보았습니다. JWT는 인증과 인가를 처리하는 데에 사용되는 중요한 기술이므로, 사용할 때에는 보안 이슈에 대해 항상 고려해야 합니다.

'HTTP & 네트워크 기초' 카테고리의 다른 글

OAuth 2.0  (0) 2023.03.05
쿠키와 세션  (0) 2023.03.05
REST API와 RESTful API  (0) 2023.03.05
HTTP 메소드  (0) 2023.03.05
네트워크 보안  (0) 2023.03.05

댓글