본문 바로가기
CS/WEB

JWT(JSON Web Token)란?

by eungineer 2022. 10. 17.

특성

  • 유저를 인증하고 식별하기 위한 Claim 기반 Web 토큰
  • 세션과 달리 서버가 아닌 클라이언트에 저장 -> 서버 부담 감소
  • 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함됨
  • JWT 사용 시 RESTful과 같은 Stateless 환경에서 사용자 데이터를 주고 받을 수 있음

구조

Header, Payload, Signature 각각의 구성요소가 점(.)으로 구분되어 있음

Header

  • JWT에서 사용할 타입과 해시 알고리즘의 종료가 담겨있음

Payload

  • 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있음

Signature

  • Header, Payload를 Base64 URL-safe Encode 한 이후 Header에 명시된 해시함수를 적용하고, 개인키(Private Key)로 서명한 전자서명이 담겨있음

인증

  1. 사용자가 ID, PW를 입력하여 서버에 로그인 인증 요청
  2. 서버에서 클라이언트로부터 인증 요청을 받으면 Header, Payload, Signature 정의하고 각각 Base64로 한 번 더 암호화하여 JWT 생성하고 쿠키에 담아 클라이언트에게 발급
  3. 클라이언트는 서버로부터 받은 JWT를 로컬 스토리지에 저장(쿠키나 다른 곳에 저장할 수도 있음)하고, API를 서버에 요청할 때 Authorization header에 Access Token을 담아 보냄
  4. 서버가 할 일은 클라이언트가 Header에 담아서 보낸 JWT가 내 서버에서 발행한 토큰인지 일치 여부를 확인하여 일치하면 인증을 통과시켜주고 아니라면 통과시키지 않음, 인증이 통과되면 페이로드에 들어있는 유저 정보를 select해서 클라이언트에게 돌려줌
  5. 클라이언트가 서버에게 요청했는데, 액세스 토큰의 시간이 만료되면 클라이언트는 리프레시 토큰을 이용해 서버로부터 새로운 엑세스 토큰 발급받음

장점

  • Header와 Payload를 가지고 Signature를 생성하므로 데이터의 위변조를 막을 수 있음
  • 인증 정보에 대한 별도의 저장소 불필요
  • 토큰에 대한 기본 정보와 전달할 정보 및 토큰이 검증되었음을 증명하는 서명 등 필요한 모든 정보를 자체적으로 지님
  • 클라이언트 인증 정보를 저장하는 세션과 달리 서버는 Stateless가 됨
  • 서버 확장성 우수
  • 토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유 가능(쿠키와 차이)
  • 모바일 환경에서도 동작(세션은 불가능)

단점

  • 쿠키/세션과 다르게 토큰의 길이가 길어, 인증 요청이 많아질수록 네트워크 부하 심화
  • Payload 자체는 암호화되지 않아 유저의 중요한 정보를 담을 수 없음
  • 클라이언트에 저장되기 때문에 DB에서 사용자 정보를 수정해도 토큰에 직접 적용 불가능

보안 전략

짧은 만료 기한 설정

- 토큰이 탈취되더라도 빠르게 만료되기 때문에 피해 최소화

- 유저가 자주 로그인해야하는 불편함

Sliding Session

- 서비스를 지속적으로 이용하는 클라이언트에게 자동으로 토큰 만료 기한을 늘려주는 방법

- 글 작성 / 결제 등을 시작할 때 새로운 토큰 발급

- 사용자는 로그인을 자주 할 필요가 없어짐

Refresh Token

- 클라이언트가 로그인 요청을 보내면 서버는 Access Token 및 그보다 긴 만료 기간을 가진 Refresh Token 발급

- 클라이언트는 Access Token 만료 시 Refresh Token을 사용해 Access Token의 재발급 요청

- 서버는 DB에 저장된 Refresh Token과 비교 후 유효한 경우 새로운 Access Token 발급, 만료된 경우에는 사용자에게 로그인 요구

- Access Token의 만료기한을 짧게 설정할 수 있으며, 사용자가 자주 로그인할 필요가 없어짐

- 서버가 강제로 Refresh Token 만료시킬 수 있음


[참고자료]

https://narup.tistory.com/232

 

JWT(Json Web Token) 토큰이란?

1. 개요 회원의 로그인 기능을 구현하려고 하다보니 자연스럽게 JWT토큰에 대해 알게 되었고, 대부분의 웹 서비스는 이 JWT토큰를 사용해서 로그인과 로그인 상태를 유지하고 있었습니다. 이러한

narup.tistory.com

https://hudi.blog/self-made-jwt/

 

직접 만들어보며 이해하는 JWT

본 포스팅에서는 JWT 의 정의, 구조, 원리 등을 알아보며 실습을 통해 ‘라이브러리 없이’ 직접 JWT 를 생성하고 해독해본다. 1. JWT 에 대하여 1-1. JWT 의 정의 Json Web Token 의 줄임말이다. RFC 7519 에

hudi.blog

https://www.popit.kr/jwt-%EC%9D%B8%EC%A6%9D%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C/

 

JWT 인증은 무엇이고 어떻게 사용해야 할까? | Popit

마이크로서비스 아키텍처가 많이 보급 되면서 클라이언트와 서버 간의 인증 상태를 유지하는 기존의 전통적인 서버 세션 방식과는 다른  클라이드 사이드 세션인 JWT(JSON Web Token) 방식이 많이

www.popit.kr

https://tecoble.techcourse.co.kr/post/2021-05-22-cookie-session-jwt/

 

인증 방식 : Cookie & Session vs JWT

1. HTTP 특성 HTTP는 인터넷 상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜입니다. 클라이언트가 서버에게 요청을 보내면 서버는 응답을 보냄으로써, 데이터를 교환합

tecoble.techcourse.co.kr

https://velog.io/@hahan/JWT%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

JWT란 무엇인가?

JWT(Json Web Token) > 정보를 비밀리에 전달하거나 인증할 때 주로 사용하는 토큰으로, Json객체를 이용함 JWT는 Json Web Token의 약자로 일반적으로 클라이언트와 서버 사이에서 통신할 때 권한을 위해

velog.io

https://velog.io/@syoung125/JWT-%ED%86%A0%ED%81%B0%EC%9D%B4%EB%9E%80

 

JWT 토큰이란??

Authentication(인증): == 로그인, 특정 서비스에 일정권한이 주어진 사용자임을 아이디와 패스워드 등을 통해서 인증을 받는 것Authorization (인가): 한번 인증을 받은 사용자가 이후 서비스의 여러 기

velog.io

https://etloveguitar.tistory.com/101

 

[JWT] JWT란 무엇인가? (JSON Web Token) 쉽게 정리한 core개념들

JWT는 개발자라면 지겨울정도로 들어봤거나 사용해볼법한 인증 방식이다. 필자도 마찬가지로 JWT를 많이 사용해 봤지만 구체적인 개념들에 대한 정리가 안돼있었다. 그래서 본 글에서 간단하게

etloveguitar.tistory.com

https://brunch.co.kr/@jinyoungchoi95/1

 

JWT(Json Web Token) 알아가기

jwt가 생겨난 이유부터 jwt의 실제 구조까지 | 사실 꾸준히 작성하고 싶었던 글이지만 JWT를 제대로 개념을 정리하고 구현을 진행해본 적이 없었는데 리얼월드 프로젝트를 진행하면서 JWT에 대한

brunch.co.kr

https://pronist.dev/143

 

JWT(JSON Web Token)의 개념부터 구현까지 알아보기

JWT(JSON Web Token) JWT 는 유저를 인증하고 식별하기 위한 토큰(Token)기반 인증이다. RFC 7519 에 자세한 명세가 나와있다. 토큰은 세션과는 달리 서버가 아닌 클라이언트에 저장되기 때문에 메모리나

pronist.dev

 

'CS > WEB' 카테고리의 다른 글

SSO(Single Sign-On)란?  (0) 2022.10.24
OpenID, OIDC(OpenID Connect)란?  (0) 2022.10.24
Authentication(인증) vs Authorization (인가)  (0) 2022.10.24
OAuth란? (OAuth2.0)  (0) 2022.10.24
쿠키(Cookie), 세션(Session), 토큰(Token) 인증  (0) 2022.10.17