[Spring] JWT 인증

HOJUN·2024년 6월 22일

Backend - Spring

목록 보기
33/34

JWT (JSON Web Token)

Json객체를 사용해 정보를 안전하게 전달할 수 있도록 설계된 토큰 기반 인증 방식이다.
Authentication & Authorization을 학습중이며 웹 보안 관련한 중요 표준이 등장했다.

JWT는 URL, HTTP Header, HTTP Form과 같은 방식 등으로 전달할 수 있으며, 서버와 클라이언트 간의 인증 정보를 포함한다.
Authentication은 클라이언트가 누구인지 인증하는 것으로 학습한 바 있다.

JWT는 웹 표준을 따르는 인증방식으로 필요한 정보를 다양하게 가지고 한 객체에 담아 전달할 수 있다.

기본적으로 HTTP는 Stateless를 지향한다.
클라이언트의 상태를 서버가 저장하지 않고 있다는 뜻이다.

이는 서버의 확장성과 트래픽, 의존성에 관해 장점을 가지는 요소로 작용하지만,
Stateful방식과 비교해 같은 데이터가 반복적인 전송으로 네트워크적 성능저하와 데이터노출의 문제가 존재할 수 있다.

이를 보와하기 위해서 토큰 방식의 JWT로 데이터의 압축 및 서명을 할 수 있게 되었다.

HEADER . PAYLOAD . SIGNATURE

JWT 토큰의 구조는 위와 같다.

  • HEADER : JWT의 타입, 암호화 알고리즘
  • PAYLOAD : 클레임 정보 (사용자 ID, 권한, 토큰 발급,만료일 등)
  • SIGNATURE : HEADER, PAYLOAD가 변조됐는지 검증

HEADER와 PAYLOAD는 Base64 형식으로 인코딩한다. 각 토큰의 구조는 JSON형식으로 이루어져 있다.
토큰의 예시를 보자 JWT.io

HEADER에 포함된 "alg"에는 HMAC SHA 256방식의 암호화 알고리즘을 지정하고 토큰을 JWT 타입으로 지정했다.

전달하려는 내용을 PAYLOAD에 담았다. 각 name을 클레임이라고 하며 Registered, Public, Private Claim으로 분류한다.

  • Registered : 등록된 클레임으로 iss(issuer), exp(expiration time), sub(subject), aud(audience) 등으로 정의한다.
  • Public : 공개 클레임으로 자유롭게 정의할 수 있는 클레임인데, 충돌을 방지하기 위해서는 주의해야한다.
  • Private : 비공개 클레임으로 정보를 공유하기 위해서 만들어진 클레임이다.

PAYLOAD에는 암호화되거나 서명되지 않는 데이터가 존재하고, Base64로 인코딩되어 디코딩되는 공개된 데이터이다.
그래서 PAYLOAD에는 중요하거나 결정적인 데이터는 포함하지 않고, 탈취되었을 때 가장 가치가 낮은 데이터를 포함한다.

SIGNATURE는 인코딩된 HEADER와 PAYLOAD, dot문자와 secret코드를 포함한다.
secret 코드는 사용자가 정의할 수 있고, 해시 알고리즘으로 변환한다.

대학교 4학년 정보보호 수업에서 배웠던 암호학이 JWT 토큰을 공부하는 데 사용될줄은 몰랐다.
JWT의 암호화 방식이나 기타 자세한 사항은 시간이 되면 따로 작성해보도록 하겠다.

0개의 댓글