cs 공부

JWT에 대해 설명해주실 수 있을까요

늘곰's 2023. 10. 16. 17:07

JWT(JavaScript Object Notation Web Token)은 웹 표준의 하나로, 정보를 안전하게 전달하기 위한 경량의 토큰 기반 인증 방식입니다. JWT는 데이터를 JSON 형식으로 표현하며, 세 부분으로 구성됩니다: Header, Payload, Signature.

 

Header(헤더): JWT의 헤더는 두 부분으로 구성됩니다. 첫 번째 부분은 토큰의 타입(JWT)과 해싱 알고리즘을 정의하는 부분입니다. 일반적으로 "alg" 키와 "HS256"과 같은 값이 사용됩니다. 두 번째 부분은 헤더를 Base64로 인코딩한 값입니다.

 

Payload(페이로드): JWT의 페이로드는 클레임(claim)이라고 불리는 데이터를 포함합니다. 클레임은 토큰에 대한 정보를 제공하는데 사용됩니다. 클레임은 세 가지 유형으로 나눌 수 있습니다

 

1. Registered Claims: 토큰에 대한 기본 정보를 제공하는 클레임입니다. 예를 들어, "iss" (발급자), "exp" (만료 시간), "sub" (제목) 등이 있습니다.

 

2. Public Claims: 사용자 정의 클레임으로, 충돌을 방지하기 위해 명명 규칙이 필요합니다. "name", "email"과 같은 사용자 정보를 담을 수 있습니다.

 

3. Private Claims: 서로 합의된 클레임으로, 서비스 간에 공유되는 정보를 담을 수 있습니다. 이러한 클레임은 충돌이 발생할 수 있으므로 주의가 필요합니다.

 

 

Signature(서명): 헤더와 페이로드의 내용을 해싱한 후, 비밀 키를 사용하여 서명합니다. 서명은 토큰의 무결성을 확인하기 위해 사용되며, 서버는 이 서명을 검증하여 토큰이 변조되지 않았음을 확인합니다.

 

JWT는 인증, 권한 부여 및 정보 교환을 위한 토큰을 안전하게 전달할 때 사용됩니다. 주로 웹 애플리케이션과 API 간의 통신에서 사용되며, 사용자 인증 및 권한 부여에 활용됩니다. 클라이언트는 JWT를 보내고, 서버는 JWT를 검증하여 클라이언트의 신원을 확인하고 권한을 부여합니다.

 

JWT 처리

서버 측에서 JWT 생성 및 검증:

JWT 발급: 사용자가 로그인 또는 인증을 통해 서버는 JWT를 생성하고 클라이언트에게 반환합니다. 이 과정은 사용자 인증과 관련이 있으며 서버 측에서 처리됩니다.

JWT 검증: 클라이언트가 요청을 보낼 때, 서버는 수신한 JWT를 검증하여 사용자의 인증 상태를 확인합니다. 이는 주로 인증 미들웨어 또는 JWT 검증 미들웨어를 사용하여 처리됩니다.

 

클라이언트 측에서 JWT 저장 및 전송

클라이언트는 JWT를 안전하게 저장해야 합니다. 대부분의 경우, JWT는 브라우저의 쿠키 또는 웹 스토리지 (로컬 스토리지, 세션 스토리지)에 저장됩니다.

클라이언트는 모든 HTTP 요청 헤더에 JWT를 포함하여 서버에 전송합니다. 이것은 HTTP 요청을 보낼 때 JWT를 "Authorization" 헤더에 넣는 것으로 처리됩니다.

 

JWT 갱신 및 주기 관리

JWT에는 일정 기간 동안 유효한 유효 기간이 있습니다. 클라이언트는 JWT의 만료가 가까워질 때, 서버에게 새로운 JWT를 요청하고 갱신해야 합니다. 이는 클라이언트 측에서 JWT 갱신을 처리합니다.

 

 

다른 API 서비스 호출 및 인증

클라이언트가 다른 API 서비스에 요청을 보낼 때, JWT는 보통 요청 헤더에 포함됩니다. 서비스는 JWT를 검증하고 클라이언트의 인증 상태를 확인합니다.

 

JWT의 검증

헤더와 페이로드 추출: 클라이언트로부터 수신한 JWT를 분해하여 헤더와 페이로드 부분을 추출합니다.

 

서명 검증: 헤더와 페이로드를 서버에서 사용하는 비밀 키를 사용하여 서명을 다시 생성합니다. 이때, 서버와 클라이언트가 동일한 비밀 키를 사용해야 합니다. 새로 생성한 서명과 클라이언트로부터 수신한 서명을 비교하여 두 서명이 일치하는지 확인합니다.

 

유효성 검사: JWT의 유효 기간을 확인하고, 클레임 (claim) 내용을 검증합니다. 이 단계에서 다음을 수행합니다:

JWT의 "exp" (만료 시간) 클레임을 확인하여 토큰이 만료되지 않았는지 확인합니다.

"nbf" (활성 날짜) 클레임을 확인하여 토큰이 활성화되기 전에는 사용되지 않도록 합니다.

"iss" (발급자) 클레임을 확인하여 신뢰할 수 있는 발급자에서 온 토큰인지 확인합니다.

 

기타 검증: 클라이언트가 특정 권한을 가지고 있는지 또는 다른 클레임 값을 검증할 수 있습니다. 예를 들어, 사용자 역할을 확인할 수 있습니다.

 

검증 결과 반환: 모든 검증 단골이 성공하면 JWT는 유효하고 검증된 것으로 간주됩니다. 서버는 클라이언트의 요청을 수용하고 해당 요청을 처리할 수 있습니다. 실패한 경우 클라이언트는 거부되거나 오류 응답을 받게 됩니다.

 

 

JWT의 재발급주기 

JWT 만료 시간 (Expiration Time, exp): JWT에는 "exp" 클레임(claim)이 포함되며, 이 클레임은 JWT의 만료 시간을 나타냅니다. 클라이언트는 JWT를 생성할 때 "exp" 클레임을 설정하고, 이 시간이 지나면 JWT는 더 이상 유효하지 않습니다.

 

JWT 재발급: 만일 JWT의 유효 시간이 지나면, 클라이언트는 서버에 새로운 JWT를 요청해야 합니다. 이것은 사용자가 로그인한 후에 다시 인증해야 할 때 유용한 방법입니다.

 

토큰 리프레시 (Token Refresh): 일부 시스템에서는 JWT를 리프레시 토큰(Refresh Token)과 함께 사용합니다. 리프레시 토큰은 일반적으로 더 긴 유효 시간을 가지며, 만일 JWT가 만료되면 리프레시 토큰을 사용하여 새로운 JWT를 발급받을 수 있습니다. 이것은 클라이언트가 사용자의 액세스를 연장하거나 재발급 받을 때 사용됩니다.

 

 

JWT토큰을 다른 API 서비스 호출 시 어떻게 잡아서 인증이 처리되는지

토큰 획득: 먼저, JWT 토큰을 얻어야 합니다. 이 토큰은 사용자 인증 후 또는 다른 서비스로부터 받을 수 있습니다.

 

HTTP 헤더에 토큰 추가: API 요청을 보낼 때, 보통 HTTP 요청의 헤더에 JWT 토큰을 포함시킵니다. 이를 "Authorization" 헤더에 "Bearer" 스키마를 사용하여 추가합니다

 

Authorization: Bearer [JWT 토큰]

API 서버에서 토큰 검증: API 서버는 요청을 받은 후, "Authorization" 헤더에서 JWT 토큰을 추출합니다. 그런 다음, 서버는 해당 토큰의 유효성을 검증합니다. 검증 과정은 다음과 같습니다

JWT의 서명을 검증: JWT의 서명은 비밀 키를 사용하여 검증됩니다. 서버는 이 토큰을 검증하기 위해 해당 비밀 키를 가지고 있어야 합니다.

만료 기간 검사: JWT에는 만료 시간이 포함되어 있으며, 이 시간을 검사하여 토큰이 만료되었는지 확인합니다.

기타 클레임 검사: 필요한 경우, 클라이언트의 역할 또는 권한과 같은 클레임을 검사할 수 있습니다.

 

API 요청 처리: 토큰이 유효하고 검증이 통과되면, API 서버는 해당 요청을 처리하고 요청한 데이터 또는 서비스를 제공합니다.

 

오류 처리: 토큰 검증이 실패하거나 토큰이 만료된 경우, API 서버는 오류 응답을 반환하거나 요청을 거부합니다. 클라이언트는 이에 대한 적절한 오류 처리를 수행할 수 있어야 합니다.

 

이러한 방식으로 JWT 토큰을 사용하여 API 서비스 호출을 인증할 수 있습니다. 중요한 것은 토큰의 안전한 관리와 서버 측에서의 유효성 검증입니다. 클라이언트와 서버 간의 공통된 비밀 키 또는 인증 정보를 사용하여 토큰을 서명하고 검증하면 보안을 유지할 수 있습니다.