티스토리 뷰
JWT(JSON Web Token)란?
일반적으로 클라이언트와 서버 사이에서 통신할 때 권한을 위해 사용하는 토큰이다.
웹 상에서 정보를 Json형태로 주고 받기 위해 표준규약에 따라 생성한 암호화된 토큰으로 복잡하고 읽을 수 없는 string 형태로 저장되어있다.
JWT 구조
JWT는 Header, Payload, Signature의 3 부분으로 이루어지며, Json 형태인 각 부분은 Base64Url로 인코딩 되어 표현된다. 또한 각각의 부분을 이어 주기 위해 . 구분자를 사용하여 구분한다. 추가로 Base64Url는 암호화된 문자열이 아니고, 같은 문자열에 대해 항상 같은 인코딩 문자열을 반환한다.
1️⃣ 헤더 (Header)
토큰의 헤더는 typ과 alg 두 가지 정보로 구성된다. alg는 헤더(Header)를 암호화 하는 것이 아니고, Signature를 해싱하기 위한 알고리즘을 지정하는 것이다.
▪️ typ: 토큰의 타입을 지정 ex) JWT
▪️ alg: 알고리즘 방식을 지정하며, 서명(Signature) 및 토큰 검증에 사용 ex) HS256(SHA256) 또는 RSA
2️⃣ 페이로드 (Payload)
전달하려는 정보(사용자 id나 다른 데이터들, 이것들을 클레임이라고 부른다)가 들어있다.
payload에 있는 내용은 수정이 가능하여 더 많은 정보를 추가할 수 있다. 그러나 노출과 수정이 가능한 지점이기 때문에 인증이 필요한 최소한의 정보(아이디, 비밀번호 등 개인정보가 아닌 이 토큰을 가졌을 때 권한의 범위나 토큰의 발급일과 만료일자 등)만을 담아야한다.
3️⃣ 서명 (Signature)
서명(Signature)은 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다. 서명(Signature)은 위에서 만든 헤더(Header)와 페이로드(Payload)의 값을 각각 BASE64Url로 인코딩하고, 인코딩한 값을 비밀 키를 이용해 헤더(Header)에서 정의한 알고리즘으로 해싱을 하고, 이 값을 다시 BASE64Url로 인코딩하여 생성한다.
const token = base64urlEncoding(header) + '.' + base64urlEncoding(payload) + '.' + base64urlEncoding(signature)
이 세 부분은 Base64url 인코딩을 사용하여 별도로 인코딩되며 JWT 생성을 위해 점(.)을 사용하여 연결된다.
위 데이터와 "secretkey" 시크릿은 토큰을 생성한다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI
이 결과가 되는 토큰은 HTML과 HTTP로 쉽게 파싱이 가능하며, 생성된 토큰은 HTTP 통신을 할 때 Authorization이라는 key의 value로 사용된다. 일반적으로 value에는 Bearer이 앞에 붙여진다.
{
"Authorization": "Bearer 생성된 토큰 값"
}
JWT 동작 원리
- 사용자가 id와 password를 입력하여 로그인 요청을 한다.
- 서버는 회원DB에 들어가 있는 사용자인지 확인을 한다.
- 확인이 되면 서버는 로그인 요청 확인 후, secret key를 통해 토큰을 발급한다.
- 이것을 클라이언트에 전달한다.
- 서비스 요청과 권한을 확인하기 위해서 헤더에 데이터(JWT) 요청을 한다.
- 데이터를 확인하고 JWT에서 사용자 정보를 확인한다.
- 클라이언트 요청에 대한 응답과 요청한 데이터를 전달해준다.
JWT 장점
- 토큰 자체에 사용자 인증에 필요한 모든 정보가 있기 때문에 별도의 인증 저장소가 필요없음
- 쿠키를 사용하지 않으므로 쿠키 취약점이 사라짐(클라 정보를 서버가 저장하지 않음)
- 서버에 부담이 적음
JWT 단점
- Self-contained: 토큰 자체에 정보를 담고 있으므로 양날의 검이 될 수 있다.
- 토큰 길이: 토큰의 페이로드(Payload)에 3종류의 클레임을 저장하기 때문에, 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.
- Payload 인코딩: 페이로드(Payload) 자체는 암호화 된 것이 아니라, BASE64Url로 인코딩 된 것이다. 중간에 Payload를 탈취하여 디코딩하면 데이터를 볼 수 있으므로, JWE로 암호화하거나 Payload에 중요 데이터를 넣지 않아야 한다.
- Stateless: JWT는 상태를 저장하지 않기 때문에 한번 만들어지면 제어가 불가능하다. 즉, 토큰을 임의로 삭제하는 것이 불가능하므로 토큰 만료 시간을 꼭 넣어주어야 한다.
- Store Token: 토큰은 클라이언트 측에서 관리해야 하기 때문에, 토큰을 저장해야 한다.
'Tech Interview > 기술 면접 준비' 카테고리의 다른 글
[Backend 개발자 면접 준비] OSI 7 계층이란? (0) | 2023.07.31 |
---|---|
[Backend 개발자 면접 준비] 오버로딩 vs 오버라이딩 (Overloading vs Overriding) (0) | 2023.07.29 |
[Backend 개발자 면접 준비] TCP 연결 / 해제 과정 (3 / 4 way HandShake) (0) | 2023.07.26 |
[Backend 개발자 면접 준비] Java 8 추가 된 내용 (0) | 2023.07.24 |
[Backend 개발자 면접 준비] 데이터베이스 - 트랜잭션(Transaction) (0) | 2023.07.24 |
- Total
- Today
- Yesterday
- 프로그래머스 카카오
- 알고리즘
- 프로그래머스
- 코딩테스트
- java
- 백준
- 개발자 면접 준비
- 코테 준비
- 개발자 취준
- 백엔드 개발자
- 취준
- 코테준비
- 취업 준비
- 기술 면접 준비
- 자바
- 개발자 취업 준비
- 백엔드 개발자 취업 준비
- 백엔드 개발자 기술 면접 준비
- 알고리즘공부
- 자바공부
- 코테공부
- 제로베이스 백엔드 스쿨
- 제로베이스 백준 장학금
- 취업준비
- 코딩테스트공부
- 주니어 개발자 취업 준비
- 프로그래머스 자바
- 알고리즘 공부
- 코딩테스트 공부
- 코딩테스트 준비
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |