특성
- 유저를 인증하고 식별하기 위한 Claim 기반 Web 토큰
- 세션과 달리 서버가 아닌 클라이언트에 저장 -> 서버 부담 감소
- 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함됨
- JWT 사용 시 RESTful과 같은 Stateless 환경에서 사용자 데이터를 주고 받을 수 있음
구조
Header, Payload, Signature 각각의 구성요소가 점(.)으로 구분되어 있음
Header
- JWT에서 사용할 타입과 해시 알고리즘의 종료가 담겨있음
Payload
- 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있음
Signature
- Header, Payload를 Base64 URL-safe Encode 한 이후 Header에 명시된 해시함수를 적용하고, 개인키(Private Key)로 서명한 전자서명이 담겨있음
인증
- 사용자가 ID, PW를 입력하여 서버에 로그인 인증 요청
- 서버에서 클라이언트로부터 인증 요청을 받으면 Header, Payload, Signature 정의하고 각각 Base64로 한 번 더 암호화하여 JWT 생성하고 쿠키에 담아 클라이언트에게 발급
- 클라이언트는 서버로부터 받은 JWT를 로컬 스토리지에 저장(쿠키나 다른 곳에 저장할 수도 있음)하고, API를 서버에 요청할 때 Authorization header에 Access Token을 담아 보냄
- 서버가 할 일은 클라이언트가 Header에 담아서 보낸 JWT가 내 서버에서 발행한 토큰인지 일치 여부를 확인하여 일치하면 인증을 통과시켜주고 아니라면 통과시키지 않음, 인증이 통과되면 페이로드에 들어있는 유저 정보를 select해서 클라이언트에게 돌려줌
- 클라이언트가 서버에게 요청했는데, 액세스 토큰의 시간이 만료되면 클라이언트는 리프레시 토큰을 이용해 서버로부터 새로운 엑세스 토큰 발급받음
장점
- 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 만료시킬 수 있음
[참고자료]
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
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
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 |