본문 바로가기
개발용어

JWT란 (json web token 이란), JWT 사용하는 이유, JWT 동작방식

by devscb 2022. 1. 5.
반응형




JWT란?


JWT(JSON Web Token)은 당사자 간 정보를 안전하게 전송할 수 있는 방법을 JSON 객체로 정의한 개방형 표준(RFC 7519)입니다.
이 정보는 디지털 서명을 사용하기 때문에 데이터 위/변조를 검증할 수 있으며, 신뢰할 수 있습니다.
JWT는 (HMAC 알고리즘으로) 비밀 또는 RSA 또는 ECDSA를 사용하는 공용키/비밀키 쌍을 사용하여 서명할 수 있습니다.
서명된 토큰은 그 안에 포함된 클레임의 무결성을 검증할 수 있는 반면,
암호화된 토큰은 그러한 클레임을 다른 당사자로부터 숨길 수 있습니다.
토큰이 공용/비밀 키 쌍을 사용하여 서명될 때, 서명은 또한 개인 키를 가진 당사자만이 서명한 당사자임을 인증할 수 있습니다.


JWT를 사용하는 이유


- 권한 부여: JWT를 사용하기 위한 가장 일반적인 사용처입니다.
사용자가 로그인하면 이후의 각 요청에는 JWT가 포함되어 사용자가 해당 토큰으로 허용된 경로,
서비스 및 리소스에 액세스할 수 있습니다.

- 정보 교환: JSON 웹 토큰은 당사자 간에 정보를 안전하게 전송하는 좋은 방법입니다.
JWT는 예를 들어 공용/개인 키 쌍을 사용하여 서명할 수 있기 때문에 보낸 사람이 자신이 누구인지 확인할 수 있습니다.
또한 헤더와 페이로드를 사용하여 서명을 계산하므로 내용이 조작되지 않았는지 확인할 수도 있습니다.


JWT 동작방식


JWT를 이용한 인증 동작방식 예제를 통해 JWT 동작 원리를 알아보겠습니다.

1. 클라이언트에서 id, pw 정보를 서버로 보냄
2. 서버에서 id, pw 정보를 이용하여 JWT token 을 생성함
3. 서버에서 클라이언트로 JWT token 을 보냄
4. 클라이언트에서 서버로 서비스 요청시, JWT token 을 같이 보냄.
5. 서버에서 서비스 처리시, JWT token 을 검증, 일치하면 서비스를 동작시켜 클라이언트로 응답

이를 그림으로 나타내면 아래와 같습니다.


+------------+            +--------+
| 클라이언트 |            | 서버   | 
+------------+            +--------+
 |                             |
 | 1. id, pw 입력하여 api 호출 |
 |---------------------------->| 
 |                             |
 | 2,3. 서버에서 JWT 토큰 생성후 보냄 
 |<----------------------------| 
 |                             |
 | 4. api 호출시 JWT token도 보냄 
 |---------------------------->|
 |                             |
 | 5. JWT 검증후 이상없으면 return 
 |<----------------------------| 
 



이 때, 4~5 부분은 JWT를 생성했었던 서버와 같은 서버가 아니여도 됩니다.
예를 들어 MSA 방식과 같이 서비스 마다 여러 서버로 구성되어 있는 경우,
인증서버와 서비스를 제공하는 서버가 각각 다를 수 있습니다.




JWT - token 구성요소, token 생서


JWT 동작을 위해 JWT token 이 필요한것을 알아보았는데요,
token 이 만들어지는 방법을 알아보겠습니다.

token은 JSON 형태로 표현이 되며, 다음과 같은 점(.) 으로 구분된 세 부분으로 구성됩니다.
- Header (헤더) : Token의 기본요소
- Payload (페이로드) : 전달하려는 데이터
- Signature (시그니쳐) : 서명된 값

각각의 항목을 세부적으로 설명드리며 아래와 같습니다.
- Header : 헤더에는 일반적으로 토큰의 타입과 해시함수를 명시합니다.
예를 들어, 아래와 같이 표현됩니다.


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




- Payload : 페이로드에는 토큰에 담을 claim(클레임) 정보를 포함합니다. Claim이란, payload에 담는 정보의 한 조각을 부르며, key-value 쌍으로 이뤄져 있습니다.
상대방에게 전달한 데이터를 포함한다고 생각하시면 됩니다.
JWT는 보통 인증에서 많이 사용하므로, 아래와 같은 식으로 표현할 수 있습니다.


{
 'role':'admin'
}



- Signature : 시그니쳐는 header와 payload를 해시함수에 의해 계산한 결과를 포함합니다.


Header, Payload, Signature 를 합치면 JWT를 위한 토큰이 되며, 이를 통해 데이터를 주고 받을 수 있습니다.
토큰 문자열의 예를 들면 아래와 같습니다.


eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI



알수없는 문자열로 되어있습니다.
하나 빼먹은게 있는데요, header, payload, signature는 그대로 사용하는게 아니라
각각의 부분은 base64 인코딩을 사용하여 토큰을 생성합니다.
즉, token 문자열은 아래와 같이 만들어진다고 볼 수 있습니다.


const header = {
 "alg": "HS256",
 "typ" : "JWT"
}
const payload = {
 'role':'admin'
} 
const signature = HMAC_SHA256(
 secret, // secret 은 암호화를 위한 임의의 비밀키 입니다.
 header + '.' + payload
)
const token = base64urlEncoding(header) + '.' + base64urlEncoding(payload) + '.' + base64urlEncoding(signature)




세션방식과의 비교


JWT라는 기술이 있기전, 인증방식은 세션/세션쿠키를 사용하여 사용자 인증을 했었습니다.
세션은 서버에서 payload와 같은 정보를 담고 있었고, 세션쿠키는 클라이언트의 쿠키에서 고유값을 담고 있었습니다.
클라이언트에서 api 호출시 고유값을 서버에 넘기고, 서버에서는 고유값을 key로 찾아, 권한정보를 확인하는 방식입니다.
이전에는 front-end / back-end 코드가 한데 뭉쳐서 있어서 아래와 같은 코딩이 있었습니다.


if($session['isadmin']) { echo "admin "; }



최근에는 MSA 방식이 활발히 도입이 되면서 세션값을 남기고 클러스터링 하는게 부담이 되어서인지 JWT가 많이 쓰이게 된 것 같습니다.
그럼에도 불구하고, JWT가 완벽한것은 아닙니다.

암호화되어있긴 하지만, 데이터가 클라이언트에 온전히 있으므로 복호화될경우 큰 문제가 생길수 있습니다.
따라서 민감한 정보는 담지 않도록 해야합니다.
또한, token 길이가 세션쿠키에 비해 길어질 수 있어 네트워크 속도 저하를 일으킬 수 있고,
token 길이에 제한이 있습니다.
요새 대부분의 서비스는 JWT를 이용하겠지만, 이 점을 잘 고려하여 JWT를 사용해야겠습니다.

총평


JWT는2010년에 처음 만들어졌고 2010년 중반쯤부터 얘기가 많이 나오기 시작했던것으로 기억합니다.
최신기술이라고 생각했었는데, 10년이 넘은 기술이나 나름 또 오래되었다고도 볼 수 있겠네요.
이전에는 서버 구성시 돈 크게 들여서 서버 두대 정도로 구성하고 failover 되는식으로 많이 봤었는데,
언제부터인가 도커가 생겨나고, 쿠버네티스가 만들어지고 AWS가 생기면서 기존의 세션방식을 대체할 기술중 JWT가 각광받게 된거 같습니다.
여전히 레거시에서는 세션방식을 많이 쓰겠지만, 신규로 서비스를 만들 때에는 JWT를 쓰지 않을 이유가 잘 없을것 같습니다.
여러대의 서버를 썼을때 세션클러스터링해야하는 문제라던지, 세션을 저장해야할 데이터가 너무 커질 수 있다는 위험 등등을 해결하기엔 좋습니다.
예전에 세션을 저장하는 시간을 좀 길게 잡았다가 DOS 공격을 당할때 CPU/ DISK 둘다 급증하는 문제가 있었던게 생각이 나는데,
JWT로 개발을해썼다면 단순 CPU 증가만 했겠지요. 둘다 신경쓰는것보다는 하나만 신경 쓸수있도록 개발하는게 훨씬 대처하기가 좋으니깐요.


JWT란 (json web token 이란), JWT 사용하는 이유, JWT 동작방식
#JWT,#JSON,#WEB,#token,#MSA,#session,#javascript,#세션,#자바스크립트

https://devscb.com/post/80

 

What is JWT (json web token), why to use JWT, how JWT works

What is JWT?JSON Web Token (JWT) is an open standard (RFC 7519) that defines as a JSON object a way to securely transmit information between parties.Because this information uses a digital signature,

devscb.com

 

728x90
반응형

댓글