티스토리 뷰
JWT 에 대한 지식이 너무나도 부족한 나에게 JWT 웹 토큰을 생성하고 검증할 수 있는 일이 주어졌다.
사실 짧은 시간내에 개발을 진행해야 했던 상황이라 JWT에 대해서 공부하기엔 시간이 부족했다. 😥
.
.
.
애플리케이션을 개발할 떄 모든 사용자가 전부 사용하도록 구현하면 어떻게 될까?
예로 구글 본사로 생각해보자. (사실무근)
구글에 모두가 출입할 수 있지는 않을 것이다. 출입증이 있는 사람만 가능하겠다.
또한 특정 오피스 같은 경우에는 특정 인물만 들어갈 수 있을 것이다.
가짜 출입증을 만들어서 들어간다고 했을 때 아마 시스템 상으로 검증을 할 것이다.
만약 출입증이 없이 모두가 들어갈 수 있다고 하면 악의를 품은 사람들이 문제를 일으킬 수도 있을 것이다.
.
따라서 출입증을 가지고 있는 즉, 이미 증명된 사람만이 구글에 들어갈 수 있는 것처럼 우리가 만든 프로그램도 이미 인증이 된 사용자만이 서비스를 사용할 수 있도록 제공해야 한다.
인증할 수 있는 방법은 여러가지 방법이 있지만 오늘은 JWT 에 대해서 알아보기로 한다.
JWT(JSON Web Token) 이란
웹표준(RFC-7519) 으로서 당사자간에 인증정보를 JSON 형태로 안전하게 교환할 수 있도록 만들어진 토큰이다.
JWT는 시크릿 키를 활용한 HMAC 알고리즘 또는 퍼블릭, 프라이빗 키페어를 이루는 RSA, ECDSA를 사용하여 인증할 수 있다.
구성요소
위 사진의 왼쪽 데이터를 보면 dots(.)
이 2개가 있다.
dots(.)
기준으로 3가지의 구성 요소가 있다.
xxxxx.yyyyy.zzzzz
header.payload.signature
Header
- 토큰 유형(typ)과 서명 알고리즘(alg - HMAC SHA256 또는 RSA) 으로 구성된다. (위 사진의 오른쪽 Header 참고)
- Base64 로 인코딩 되어 JWT의 첫번째 부분(xxxxx)이 된다.
Payload
- 추가 데이터에 대한 정보를 담기위한 클레임으로 이루어져 있다.
- name : value 형식
- Base64로 인코딩 되어 JWT의 두번째 부분(yyyyy)이 된다.
- 3 종류의 클레임 타입이 있다.
Registered Claims
- 필수는 아니지만 권장되며 이름이 미리 정의된 클레임의 집합이다.
- 해당 클레임에 들어갈 정보는 여기 를 참고하자!
Public Claims
- 사용자가 마음대로 정의할 수 있으나 충돌의 우려가 있으니 여기 에 정의 된 대로 사용하는 게 좋다.
- 아니면 URI 형식을 사용해야 한다.
Private Claims
- 통신을 주고받는 사용자간에 데이터를 공유하기 위한 사용자 지정 클레임의 집합이다.
Signature
- 메세지가 변경되지 않았는지 확인하는데 사용된다. (서버에서 확인)
- signature 생성하는 방법은 다음과 같다.
HMACSHA256(base64UrlEncode(header) + "." + base64Encode(payload), secretKey)
위 예시에서 HMACSHA256 알고리즘방식을 사용하였는데 자세한 내용은 여기 에서 확인해보자.
동작 방식
사용자가 로그인 하는 과정을 예시로 들어보자.
로그인 되지 않은 사용자는 어떠한 서비스도 사용할 수 없다고 가정한다.
1. 클라이언트가 아이디와 패스워드를 Auth 서버에 인증을 요청한다.
2. 서버측에서 로그인 가능한 사용자라고 판단되면 JWT 를 생성하여 전달한다.
3. 사용자는 해당 JWT 로 해당 사용자가 접근할 수 있는 API에 접근할 수 있다.
'Security' 카테고리의 다른 글
[Security] 대칭 암호와 비대칭 암호 (0) | 2022.07.12 |
---|
- Total
- Today
- Yesterday
- fail-fast
- nosql
- 인스턴스변수
- 정적변수
- nginx
- fail-safe
- HashMap
- AutoConfiguration
- 추상클래스
- spring boot
- HashSet
- Hash
- 오블완
- Spring
- Caching
- object
- Red-Black Tree
- syncronized
- 자동구성
- JPA
- 인터페이스
- Security
- 고정 세션
- java
- 티스토리챌린지
- 다중화
- 로드 밸런서
- Sticky Session
- @conditional
- Load Balancer
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |