목록으로
Network

Json Web Token에 대해서 알아보자

Dev Park
3/9/2023
28 views

서론

로그인과 같은 유저인증 서비스를 만들때 유저를 식별할 수 있는 방법으로는 쿠키나 세션 등이 있다.
오늘은 백엔드에서 유저를 식별해 검증된 사용자인지 알 수 있는 방법중에 하나인 JWT에 대해서 알아보자.

JWT란?

Json Web Token

백엔드에서 인증된 유저만 서비스를 이용하게 하려면 인증받은 유저인지 식별하는 방법이 필요하다.
여기서 사용되는 JWT는 토큰 기반의 인증서비스이다.

기존의 쿠키나 세션과는 어떤 점에서 다른 것일까?

우선 차이점을 알려면 쿠키와 세션에 대해서 간단하게 알아봐야한다.

쿠키는 클라이언트에 저장해 사용하는 작은 기록 정보 파일이다.
필요할때마다 정보를 참조하거나 재사용할 수 있는 특징이있다.
로그인이 되었을때 쿠키에 어떠한 정보를 저장하여 그 정보를 서버에서 참조해 인증하는 방식이다.

세션은 일정시간동안 같은 브라우저(클라이언트)로 부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지 시키는 기술이다.
즉 하나의 브라우저의 접속해 있는 상태를 하나의 단위로보고 그것을 토대로 유저를 인증하는 방식이다.

그렇다면 JWT는 어떤 기능일까?

클라이언트에 Json 형태의 인코딩된 정보를 토큰으로 보내어 그 정보를 토대로 인증하는방식이다.
세션과 다른점은 서버에 토큰에 대한 정보를 일체저장하지 않는다는 점이다.

세션과는 어떻게 다른지 알겠다. 하지만 쿠키와 비슷해보이는데 어떤 점이 다른 것일까?

쿠키와 다른점

쿠키는 서버에서 만든 임의의 코드라면 JWT는 서명된 토큰이다.
즉 공개, 개인 키를 이용해 서명한다.

쿠키는 중간에 탈취당하거나 변조될 위험이 있다.
하지만 JWT는 서명된 토큰이라서 개인키를 서버가 보유하고 있으면서 이 토큰이 정상적인 토큰인지 인증할 수 있다.

또한 쿠키는 토큰에 비해 담을 수 있는 데이터 길이에 제한이 있다.
또한 웹브라우저마다 쿠키에 대한 지원 방식이 다르기때문에 브라우저간 공유가 불가능하다.

JWT의 구조

JWT는 세가지 요소로 구성되어 있다.

  1. Header
  2. Payload
  3. Signature

각 구성요소에 대해서 알아보자.

Header에는 보통 토큰의 타입이나, 서명 생성에 어떤 알고리즘이 사용되었는지 저장한다.

json
1{ 2 "typ": "JWT", 3 "alg": "HS512" 4}

위는 Header의 예시로 토큰 타입이 JWT, 개인키 서명에 HS512 알고리즘을 사용해 암호화했다는 것을 알 수 있다.

Payload

payload 는 사용할 정보들의 조각인 Claim이 담겨있다.
즉 인증에 사용할 데이터가 담겨있는 부분이다.

Json
1{ 2 "sub": "123456", 3 "name": "John Doe", 4 "iat": 15124255 5}

형태는 보통 위와 같고, 따로 정해진 데이터 타입은 없다.
하지만 대표적으로 Registered claims, Public claims, Private claims 이렇게 세가지가 있다.

Registered claims 란 미리 정의된 클레임으로 구성요소는 아래와 같다.

  1. iss(issuer: 발행자)

  2. exp(expireation time; 만료 시간)

  3. sub(subject; 제목)

  4. iat(issued At; 발행 시간)

  5. jti(JWI ID)

Public claims 는 사용자가 정의할 수 있는 클레임 공개용 정보를 전달하는데 사용한다.

Private claims 해당하는 당사자들 간에 정보를 공유하기 위해 만들어진 사용자 지정 클레임이다.
외부에 공개되도 상관없지만 해당 유저를 특정할 수있는 정보들을 담는다.

Signature

Signature는 토큰에한 서명이다.
암호화되었기때문에 아래는 Signature를 디코딩한 구조이다.

javascript
1HMACSHA512( 2 base64UrlEncode(header) + "." + 3 base64UrlEncode(payload), 4 your-256-bit-secret 5) secret base64 encoded

Header 와 Payload를 사용할때는 인코딩 되었던 값들을 디코딩된 상태로 사용한다.
즉 Header와 payload를 디코딩한 값과, your-256-bit-secret 즉, 서버가 가지고있는 개인키를 이용해 암호화된 값이 있다.

따라서 Signature은 서버에서 이 토큰이 유효한지 개인키를 이용해 확인할때 사용되는 부분이다.

JWT 장점

위에서 말한 것처럼 서버에 별도적으로 데이터를 저장할 필요가 없기때문에 서버에 가해지는 부하가 줄어든다.
공개키와 개인키를 이용해 암호화하였기때문에 좀 더 안전하다.
그리고 브라우저나 서비스끼리의 호환성이 좋다.

마치며

오늘은 사용자 인증 방식중 하나인 JWT에 대해서 알아보았다.
다음 게시글은 실제로 JWT를 어떻게 구현하는지에 대해서 알아보자.