JWT는 무엇인가요?

마수리·2022년 9월 2일
0

JWT

목록 보기
1/1
post-thumbnail

JWT

HTTPSTATELESS가 무엇인지 시작해서 JWTSession방식과 비교해서 설명합니다. JWT의 탄생배경과 구성요소 등은 부디 제 글을 읽고 이해해주셨으면 합니다. 글 후반에 JWT 토큰이 어떻게 해서 Server에서 본 Server가 발행한 조작되지 않은 토큰이란 것을 어떻게 확인하는지를 이해하시면 제 글을 2번 읽으실 필요가 없을 것입니다. 다만 이 부분은 이해가 쉽지 않을 수 있으시니 읽는 중 이해가 안가신다면 굳이 읽으실 필요는 없습니다. 나중에 다른 좋은 글 많이 읽어보시고 다시 찾아오셔서 읽어보셔도 됩니다. 그럼 지금부터 시작하겠습니다. 🚀

인증의 필요이유

우리가 현시대에서 사용하는 대부분의 데이터를 주고 받는 프로토컬은 HTTP일 것입니다.
HTTP에는 여러가지 특징들이 있을 수 있겠지만, 인증을 알아보기 위해서 필요한 특징은 STATELESS입니다.
이것은 Client가 Server에 데이터를 요청할 때 Server는 Client의 이전 데이터에 대해서 아무것도 기억하지 못하고 있다는 것입니다.

STATELESS 통신 예시

이해하기 쉽게 일상적인 예시를 들면 아래와 같습니다.

Client : 안녕하세요. 마수리입니다.
Server : 반갑습니다. 마수리님. (서버는 이 대화를 기억하지 않음)

Client : Server님 잘 지내셨어요?
Server : 네! 근데 누구시죠?

이런 대화를 실제 컴퓨터상의 대화로 생각하면 아래와 같은 상황이 생길 수 있습니다.

Client : 로그인 시도
Server : 로그인 성공입니다. (서버는 Client의 로그인 시도 성공 여부를 기억하지 않는다.)

Client : 저의 게시글을 보여주세요
Server : 로그인 된 정상 Client인지 알 수 없으므로 처리를 거부합니다.

이런 상황을 타개하기 위해서 로그인 정보를 Server쪽에 저장할 수 있는데 이런 방법을 Session방식이라고 한다.
이즈음에서 Session방식과 같이 공부할 수 있는 JWT의 개념이 등장하게 된다.

Session 방식의 문제

오늘 우리가 알아볼 내용은 JWT이기 때문에 Session에 대해서는 간단하게 살펴보려한다.

  1. Session의 정보는 서버에 저장되므로 동시접속 유저가 많아지면 많아질수록 서버에 부담이 된다.
  2. Scale Out 등으로 인한 로그벨런싱 되는 상황에서 올바른 방법으로 DB를 찾아가도록 해야한다.
  3. 마이크로 서비스 환경에서 2번의 내용과 같이 올바른 데이터를 찾아갈 수 있도록 해야한다.

JWT 방식

인터넷 표준 인증 방식 JWTSession방식과 다르게 Client측이 데이터를 가지고 있는 방식입니다. 쉽게 예를 들면 Client에게 이름표를 달아주고 그 이름표 안에 이런 저런 데이터를 넣는 것입니다. 그 후 Client가 Server에 요청할 때마다 Server에서는 Client의 이름표를 보고

아!! 이 친구 아까 요청했던 친군가보네 이름표에 써져있는 기본적인 데이터와 이 친구가 지금 요구하는 데이터를 이용해서 처리 한 결과를 돌려주자!'

라고 Server에서는 생각할 수 있게 하는 것입니다. 기본적으로 JWT에는 인증정보가 들어가고 Server에서 넣고싶은 다른 데이터도 넣을 수 있습니다.

JWT의 구성 방식

JWT는 긴 Token String을 점(.)으로 구분한 3가지 영역을 갖고 있습니다.

  • Header
  • Playload
  • Signature

데이터를 시각적으로 표현하면 아래와 같이 점(.)으로 구분된 3가지 데이터 영역이 있습니다.

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

Header는 JWT의 기본정보를 담는 곳으로 어떤 해싱 알고리즘을 사용했는지 입력하는 부분이 핵심이다. 여기서 설정한 해싱 알고리즘을 이용해 아래서 살펴볼 Signature에서 값을 해싱할 것입니다.

Payload

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

혹시 Payload라는 단어를 들어본적 있나요? 컴퓨터 사이언스에서 많이 사용하는 단어로 꼭 알아둬야 하는 단어입니다. 이 단어의 의미는 부수적인 데이터를 제외한 실제로 필요한 데이터라는 것이다. 대표적으로 JWT에서 Payload는 실제로 인증을 누가 했고 언제 발행됐고 이 토큰이 언제 만료 되는지 등의 데이터가 들어가고 필요에 따라 서버가 원하는 값을 넣기도 한다.

하지만 이것을 기억해야한다. Payload의 경우 사람의 눈으로 보기엔 읽을 수 없는 문자열 같지만 그저 인코딩만 된 문자열입니다. 저 문자열을 아무나 다시 디코딩하면 사람이 읽을 수 있는 문자열로 변하게 된다.

Payload에 비밀번호와 같은 아주 중요한 정보를 넣어도 되는가? 필자는 이메일 주소를 JWT에 넣으려다 넣지 않는 것으로 판단했다. 이메일 주소도 충분히 개인을 특정할 수 있는 개인정보라고 판단했기 때문이다. (관련 글)

Signature

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),  
  your-256-bit-secret
)

위에 적혀있는 Signature의 내용을 읽어보자 Header와 Payload를 Base64로 인코딩한 값과 서버의 비밀키를 Header의 alg에서 설정한 알고리즘으로 해싱하고있다.

이 3개의 값을 하나로 만들면 JWT토큰이 만들어 지는 것이다.

이제 Client에서 Server로 통신할 때마다 우리는 이렇게 만들어진 JWT값을 Server로 같이 보내줄 것이다. 그럼 Server에서 JWT값을 보고 우리가 인증한 것이 맞구나라며 사용자 인증을 해준다.

JWT의 이 요상한 string 값이 어떻게 본 Server에서 인증한 것이라고 Server는 확신할 수 있을까? 혹시나 서버에 도착하기 전에 해커에게서 변형이 일어난 데이터일 수도 있지 않은가..?😱 그것은 위에서 살펴본 Signature에 들어간 Server의 비밀키를 이용한 암호화와 해시라는 것을 이해해야한다.

JWT의 장점

  • Session 방식과 다르게 서버에 부담을 줄일 수 있다.
  • Session 방식과 다르게 마이크로 서비스 환경에 더 잘 대응할 수 있다.

JWT의 단점

  • 토큰 방식이기 때문에 토큰을 갈취 당하면 전혀 대처할 수 없다. (서버에 입장할 수 있는 키를 빼앗기면 서버 입장에서는 올바른 키를 이용해 문을 열고 들어오는 사람이 해커인지 알 수 없다.)
  • 토큰 방식이기 때문에 서버에서 로그아웃등의 컨트롤을 할 수 없다.

이렇게 간단하게나마 JWT에 대해서 알아보았다. JWT가 왜 생기게 되었는지 Session방식과는 어떤 차이가 있는지 JWT는 어떻게 구성되어있는지 장단점은 무엇인지 등을 기억해 두었으면 한다.

profile
.NET 개발자 마수리입니다 🖐

0개의 댓글