JWT 토큰이란?
JWT(Json Web Token)이란 Json 객체에 인증이 필요한 정보들을 담은 후 비밀키로 서명한 토큰으로, 인터넷 표준 인증 방식이다. 공식적으로 인증(Authentication) & 권한부여(인가, Authorization) 방식으로 사용된다.
JWT 프로세스
[로그인 전 과정(before)]
- 사용자가 아이디와 비밀번호 혹은 소셜 로그인을 사용하여 서버에 로그인 요청을 보낸다.
- 서버는 비밀키를 사용해 JSON 객체를 암호화한 JWT 토큰을 발급한다.
- JWT를 Header에 담아 클라이언트에 보낸다.
[로그인 이후 과정]
- 클라이언트는 JWT를 로컬에 저장해놓는다.
- API 호출을 할 때마다 Header에 JWT를 담아 보낸다.
- 서버는 헤더를 매번 확인하여 사용자를 인증하고 API에 대한 응답을 보낸다.
HTTP의 특성
Connectionless : 한 번 통신이 이뤄지고 난 후에 연결이 바로 끊어진다.
Stateless : 이전 상태를 유지/기억하지 않는다.
우리는 HTTP 프로토콜을 사용해서 통신을 한다. 하지만 HTTP는 Connectionless 하고 stateless 하다는 특성이 있다.
따라서 화면을 이동하며 새로운 API를 요청하면 다시 신뢰할만한 사용자인지 인증하는 과정을 거쳐야 한다.
매번 사용자가 인증하는 과정은 귀찮을 뿐만 아니라 통신이 느려지는 문제가 될 수 있다.
따라서 인증된 사용자가 어느 정도 기간동안 재인증 하지 않아도 되도록 만든 것이 Access Token 이다.
JWT의 구조
💡 Header
- alg : Signature에서 사용하는 알고리즘
- typ : 토큰 타입
Signature에서 사용하는 알고리즘은 대표적으로 RS256(공개키/개인키)와 HS256(비밀키(대칭키))가 있다.
💡 Payload
- 사용자 정보의 한 조각인 클레임(Claim)이 들어있다. 즉, 서버와 클라이언트가 주고받는 시스템에서 실제로 사용될 정보에 대한 내용을 담고 있는 섹션이다.
key-value 형식으로 이루어진 한 쌍의 정보를 Claim 이라고 칭한다.
- sub : 토큰 제목(subject)
- aud : 토큰 대상자(audience)
- iat : 토큰이 발급된 시각 (issued at)
- exp : 토큰의 만료 시각 (expired)
💡 Signature
Signature 는 헤더와 페이로드의 문자열을 합친 후에, 헤더에서 선언한 알고리즘과 key를 이용해 암호화한 값이다.
Header와 Payload는 단순히 Base64URL로 인코딩되어 있어 누구나 쉽게 복호화할 수 있지만, Signature는 key가 없으면 복호화할 수 없다.
인코딩
- 공개적으로 사용 가능한 방법을 통해 데이터를 변환하는 것, 다른 시스템에서의 데이터 유용성을 높이고 저장에 필요한 공간을 줄이려는 의도로 이루어진다.
암호화
- 데이터를 비밀로 유지하려는 의도로 데이터를 변환하는 것, 암호 알고리즘을 이용해 데이터를 암호화하고 특수 키를 사용하여 암호를 복호화한다.
✅ 실제로 사용해보기
https://jwt.io/ 에 들어가 token 값을 입력하면 현재 사용중인 JWT 토큰이 어떤 구조로 되어있는지 쉽게 확인할 수 있다.
확인할 수 있듯이 header와 payload는 누구나 쉽게 확인이 가능하다. 따라서 이 부분들에는 중요한 정보를 담으면 안된다.
'Knowledge > 이론' 카테고리의 다른 글
오라클 함수 - 단일행 함수 (1) | 2024.07.24 |
---|---|
오라클 데이터베이스 (2) | 2024.07.23 |
소프트웨어 아키텍처 (0) | 2024.06.27 |
JPA와 Spring Data JPA 차이점 (+Hibernate) (0) | 2024.06.22 |
레디스를 메시지 브로커로 사용하기 (0) | 2024.06.21 |