hey_mi
heymi 스터디기록
2024.09.05

JWT란?

웹에서 사용되는 JSON형식의 토근에 대한 표준 규격이다. 주로 사용자의 인증 또는 인가정보?를 서버와 클라이언트간에 안전하게 주고 받기 위해서 사용된다.

Authorization HTTP 헤더를 Bearer <토큰>의 형태로 설정하여 클라이언트에서 서버로 전송되며, 서버에서는 토큰에 포함되어 있는 서명(signature) 정보를 통해서 위변조 여부를 빠르게 검증할수있다.

JWT토큰은 eyj로 시작하는 아주 긴 문자열로 온라인 디버거를 통해서 실제로 저장되어 있는 내용을 JSON형태로 확인 해볼수 있다.

        
        
      

JWT구조

하나의 JWT토큰은 헤더 / 페이로드 / 서명 세부분으로 나누어지며 각 구역이 . 기호로 구분된다.

<헤더>.<페이로드>.<서명>

첫번째 헤더부분은 토큰의 유형과 서명 알고리즘이 명시된다.

중간 부분은 페이드에는 소위 크레임 이라고도 불리는 사용자의 인증/인가 정보가 담긴다.

마지막 부분은 헤더와 페이로드가 비밀키로 서명되어 저장된다.

JWT 토큰 키 데이터 저장 룰

<헤더>

        
        
      

<페이로드>

        
        
      

*JWT에서 자주 사용되는 JSON 키 이름* sub 키: 인증 주체(subject) iss 키: 토큰 발급처 typ 키: 토큰의 유형(type) alg 키: 서명 알고리즘(algorithm) iat 키: 발급 시각(issued at) exp 키: 말료 시작(expiration time) aud 키: 클라이언트(audience)

JWT의 장점

JWT가 등장 하기 전에는 웹에서 쿠키와 세션을 이용한 사용자 인증을 구현하였으나, JWT토큰은 자체에 사용자의 정보가 저장되어 있기 때문에 서버 입장에서 토큰을 검증만 해주면 된다는 장점을 가지고 있다.

쿠키와 세션을 사용할때는 서버단에 로그인한 모든 사용자의 세션을 DB나 캐시에 저장해놓고 쿠키로 넘어온 세션 ID로 사용자 데이터를 매법 조회 해야한다.

즉, JWT를 사용할때는 사용자가 늘어나더라도 사용자 인증을 위해서 추가로 투자해야하는 인프라 비용을 절감할수 있다.

JWT의 한계

현재 로그인된 사용자의 모든 장비들을 나열해주거나, 특정 장비에서 로그아웃을 허용하는 기능을 구현하려면 서버 단에 사용자 세션을 저장하지 않고는 어렵기때문이다.

JWT 사용 시 주의 사항

서명이 되어 있어 JWT토큰 서버에서만 유효성을 검증할수 있지만 그 안에 저장된 데이터는 누구나 쉽게 열람이 가능하여 민감한 사용자 정보를 JWT토큰에 저장하게 되면 큰 보안 문제로 이어질수 있어 주의가 필요하다.

JWT토큰에는 사용자를 식별할수 있는 아이디 정도만 저장하는 것이 좋으며, 해당 사용자에 대한 추가 정보가 필요한 경우에는 서버에서 사용자 DB를 조회하는 것이 안전할 방법이다.

불가피한 이유로 JWT토큰에 민감한 사용자 정보를 저장해야한다면 반드시 암호화를 하여 JWT토큰을 디코딩한 후에도 알아볼수 없도록 해야한다.

heymi 스터디기록
의 다른 카테고리
0
👍1
👏0
🤔
댓글 작성