CS

JWT란 무엇일까?

서윤-정 2023. 8. 10. 13:03

 

 

✔️JWT란 무엇일까?

 

JSON Web Token의 약자로, 웹 어플리케이션 간에 정보를 안전하게 전달하기 위해 사용되는 토큰 기반 인증 방식이다.

JWT는 클레임(Claim) 기반으로 정보를 저장하고, JSON 포맷으로 데이터를 표현한다.

인증에 필요한 정보들을 token에 담아 암호화 시켜 사용하는 토큰인것!

 

따라서 기본적인 인증을 진행하는 구조는 Cookie와 크게 다르지 않다.

다만, 강조되는 점은 JWT는 서명된 토큰이라는 것이다.

공개/개인 키를 쌍으로 사용하여 토큰에 서명할 경우 서명된 토큰은 개인 키를 보유한 서버가 이 서명된 토큰이

정상적인 토큰인지 인증할 수 있다는 것이다.

 

 

 

🔶 JWT는 크게 세 부분으로 구성된다.

출처: http://www.opennaru.com/opennaru-blog/jwt-json-web-token/

1. Header(헤더) 

토큰의 유형과 해시 알고리즘을 지정한다. 

일반적으로 typ(토큰타입)과 alg(해시 암호화 알고리즘) 등의 정보를 담는다.

첫째는 토큰의 유형(JWT)을 나타내고, 두 번째는 HAMC, SHA256 또는 RSA와 같은 해시 알고리즘을 나타낸다.

출처: https://brunch.co.kr/@jinyoungchoi95/1

위와 같은 경우에는 현재 토큰의 타입이 JWT이고, 개인키로 HS512 알고리즘이 적용되어 암호화가

되었다고 확인할 수 있다.

 

 

2. Payload(페이로드) 

클레임 정보를 담고 있으며, 사용자에 대한 정보나 추가적인 데이터 등을 포함할 수 있다.

JWT의 정보를 담는 주된 부분이다.

Payload에 담는 정보의 한 '조각'을 클레임이라 부르고,

이는 name / value 의 한 쌍으로 이루어져 있다.

토큰에는 여러 개의 클레임들을 넣을 수 있다.

클레임의 정보는 등록된(registered)클레임, 공개(public)클레임, 비공개(private)클레임으로 세종류다.

출처: https://brunch.co.kr/@jinyoungchoi95/1

표준 스펙상 key의 이름은 3글자로 되어있다.

JWT의 핵심 목표는 사용자에 대한, 토큰에 대한 표현을 압축하는 것이기 때문에 이를 정의한 것이라고 볼 수 있다.

 

1. iss(Issuer) : 토큰 발급자

2. sub(Subject) : 토큰 제목 - 토큰에서 사용자에 대한 식별 값이 됨

3. aud(Audience) : 토큰 대상자

4. exp(Expiration Time) : 토큰 만료 시간

5. iat(Issued At) : 토큰 발급 시간

6. nbf(Not Before) : 토큰 활성 날짜 (이 날짜 이전의 토큰은 활성화되지 않음을 보장)

7. jti(JWT Id) : JWT 토큰 식별자 (issuer가 여러 명일 때 이를 구분하기 위한 값)

 

이러한 표준 스펙으로 정의되어 있는 Claim 스펙이 있다는 것이지, 

꼭 이 7가지를 모두 포함해야 하는 것은 아니고, 상황에 따라 해당 서버가 가져야 할 인증 체계에 따라 사용하면 된다.

중요한 것은 payload에 민감한 정보를 담지 않는 것이다.

위에 header와 payload는 json이 디코딩 되어있을 뿐 특별한 암호화가 걸려있는 것이 아니기 때문에 

누구나 JWT 를 가지고 디코딩을 한다면 header나 payload에 담긴 값을 알 수 있기 때문이다.

 

 

3. Signiture(서명) : 헤더와 페이로드를 인코딩한 후, 비밀키를 사용하여 서명한다.

서버 측에서 해당 토큰의 유효성을 검증할 때 사용된다.

 

 

 

🔶 일반적으로 JWT는 다음과 같은 상황에서 사용된다.

 

• 사용자 인증 : 사용자가 로그인을 성공적으로 수행하면 JWT를 발급하여

사용자가 인증된 상태로 웹 애플리케이션에 접근하도록 한다.

이후 요청마다 JWT를 포함하여 서버에 보내며, 서버는 JWT를 검증하여 사용자의 인증 여부를 확인한다.

 

정보 교환 : 클라이언트와 서버 간에 정보를 안전하게 교환하는 데 사용된다.

클라이언트가 서버에 특정 정보를 요청하고, 서버는 해당 정보를 JWT 형태로 제공하여

안전한 방식으로 전달할 수 있다.

 

SSO(Single Sign-On) : 여러 개의 웹 애플리케이션이 있을 때, 사용자는 한 번 로그인하면

다른 모든 애플리케이션에 자동으로 로그인되도록 JWT를 사용하여 SSO 기능을 구현할 수 있다.

 

 

 

🔶 JWT 과정

출처: http://www.opennaru.com/opennaru-blog/jwt-json-web-token/

 

1. 사용자가 id와 password를 입력하여 로그인을 시도한다.

 

2. 서버는 요청을 확인하고 secret key를 통해 Access token을 발급한다.

 

3. JWT 토큰을 클라이언트에 전달한다.

 

4. 클라이언트에서 API을 요청할 때 클라이언트가  Authorization header에 Access token을 담아서 보낸다.

 

5. 서버는 JWT Signiture를 체크하고 Payload로부터 사용자 정보를 확인해 데이터를 반환한다.

 

6. 클라이언트의 로그인 정보를 서버 메모리에 저장하지 않기 위해 토큰 기반 인증 메커니즘을 제공한다.

 

인증이 필요한 경로에 접근할 때 서버 측인 Authorization 헤더에 유효한 JWT 또는 존재하는지 확인한다.

JWT에는 필요한 모든 정보를 토큰에 포함하기 때문에 데이터베이스와 같은 서버와의

커뮤니케이션 오버 해드를 최소화 할 수 있다.

Cross-Origin Resource Sharing(CORS)는 쿠키를 사용하지 않기 때문에

JWT를 채용한 인증 메커니즘은 두 도메인에서 API를 제공하더라도 문제가 발생하지 않는다.

일반적으로 JWT 토큰 기반의 인증 시스템은 위와 같은 프로세스로 이루어진다.

처음 사용자를 등록할 때 Access token과 Refresh token이 모두 발급되어야 한다.

 

 

 

🔶 장점

JWT는 클라이언트 측에서 생성되고 서버 측에서 검증되기 때문에 서버의 상태를 관리하지 않고도

효과적으로 인증과 정보 교환을 할 수 있는 장점이 있다.

또한 JWT는 토큰 자체에 필요한 정보를 포함하고 있기 때문에 별도의 데이터베이스나 서버 상태를

필요로 하지 않아서 확장성과 성능에도 우수한 선택지가 될 수 있다.

• URL 파라미터와 헤더로 사용

• 수평 스케일이 용이

• 디버깅 및 관리가 용이

• 트래픽 대한 부담이 낮음

• REST 서비스로 제공 가능

• 내장된 만료

• 독립적인 JWT

 

 

 

🔶 단점

• 토큰은 클라이언트에 저장되어 데이터베이스에서 사용자 정보를 조작하더라도 토큰에 직접 적용할 수 없다.

• 더 많은 필드가 추가되면 토큰이 커질 수 있다.

• 비상태 애플리케이션에서 토큰은 거의 모든 요청에 대해 전송되므로 데이터 트래픽 크기에 영향을 미칠 수 있다.

토큰이 탈취당하면 만료될 때까지 대처가 불가능하다.

 

 

 

🔶 서버와 클라이언트 간 정보를 주고 받을 때, HTTP 리퀘스트 해더에 JSON 토큰을 넣은 후

서버는 별도의 인증 과정 없이 헤더에 포함되어 있는 JWT 정보를 통해 인증한다.

이때 사용되는 JSON 데이터는 URL-Safe 하도록 URL에 포함할 수 있는 문자만으로 만든다.

JWT는 HMAC 알고리즘을 사용하여 비밀키 또는 RSA를 이용한 Public Key/Private Key 쌍으로 서명할 수 있다.

 

 

 

 

 

 

 

➕ 토큰(Token)이란?

 

인증이나 권한 부여 등을 위해 사용되는 작고 유일한 문자열이다.

일반적으로 토큰은 사용자를 식별하거나 사용자에게 특정 권한을 부여하는데 사용된다.

웹 애플리케이션에서는 사용자 인증을 위해 토큰을 사용하는 경우가 많다.

 

토큰은 클라이언트(사용자)가 서버에 요청을 보낼 때, 서버에서 발급하거나 인증 과정을 거쳐 얻게 된다.

이 토큰은 보통 HTTP헤더, 쿠키, URL 매개변수 등에 포함되어 서버에 전달되며,

서버는 해당 토큰을 확인하여 사용자가 인증된 상태인지, 특정 권한이 있는지 등을 판단한다.

 

일반적으로 사용되는 토큰 인증 방식에는 JWT가 있으며, 다른 토큰 방식에는 OAuth 토큰 등이 있다.

'CS' 카테고리의 다른 글

RAM(메모리) 구조 (stack, heap, data 영역, code 영역)  (0) 2023.08.16