일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- file upload
- 세션
- 웹개발
- Los
- sql injection point
- 로그인페이지
- Reflected Xss
- Cross Site Request Forgery
- MySQL
- lord of sqli
- JS
- blind sql injection
- 쿠키
- cookie 탈취
- CTF
- cors
- css
- 게시판 만들기
- union sql injection
- 로그인
- Python
- Error based sql injection
- php
- 모의해킹
- JWT
- 과제
- sql injection
- csrf
- lord of sql injection
- XSS
- Today
- Total
Almon Dev
JWT(JSON Web Token)에 대한 공부 본문
JWT
JWT(JSON Web Token)은 인증에 필요한 모든 정보(아이디, 이메일 등)를 암호화해서 JSON 토큰으로 만든 것을 말합니다.
JSON
JSON은 JavaScript Object Notation의 약자로 자바스크립트의 객체를 표현하는 방식을 흉내 내어 웹에서 정보를 주고받을 때 자주 사용하는 경량 데이터 형식입니다.
JSON의 특징
- 키와 값으로 이루어져 있습니다.
- 문자열 값을 " 큰 따옴표로 묶어야 합니다.
- 객체, 배열, 문자열, 숫자, true, false, null만 포함할 수 있습니다.
JWT 구조
JWT는 헤더(Header), 페이로드(Payload), 서명(Signature) 세 가지로 이루어져 있습니다.
==> 헤더 . 페이로드 . 서명의 구조로 만들어집니다.
헤더(Header)
- 토큰에 사용된 암호화 알고리즘과 토큰의 유형을 포함하는 부분입니다.
- 사용되는 키가 여러 개일 때 어떤 키를 사용할 것인지에 대한 값을 포함합니다.
Header JSON
{
"alg" : "HS256",
"typ" : "JWT",
"kid" : "key1",
}
"alg"에는 암호화 알고리즘을, "typ"에는 JWT토큰임을 표시하는 "JWT"값을 넣은 JWT 헤더입니다.
"kid"는 사용될 시크릿키의 id를 의미합니다.
key JSON
{
"key1" : "ASHDJLAKSNCXZVOAHDSF",
"key2" : "DNFLKJNZXJLUZOXFHCJO",
}
서버에 시크릿키가 2개 존재할 때 헤더에서 kid를 가져온 뒤, "key1"의 값을 꺼내서 복호화할 수 있습니다.
페이로드(Payload)
- 사용자 인증에 필요한 정보와 같은 실제 내용을 포함합니다.
- Base64로 URL인코딩을 해서 URL전송에서 데이터 손실을 막습니다.
- 따로 암호화를 하지 않기 때문에 민감한 정보를 포함해서는 안됩니다.
- 한 개의 키와 값의 쌍을 클레임(Claim)이라고 부릅니다.
- 미리 약속된 공개 클레임(Public Claim)과 비공개 클레임(Private Claim)이 있습니다.
Payload JSON
{
// 비공개 클레임(Private Claim)
"eamil" : "almon@test.com",
"admin" : true,
// 공개 클레임(Public Claim)
"iss": "http://almon.auth.com",
"sub": "almon",
"aud": "http://almon.test.com",
"iat": time(),
"nbf": time() + 10,
"exp": time() + 3600,
"jti": "token-almon"
}
비공개 클레임은 사이트마다, 서비스마다 자유롭게 정의한 클레임입니다. 특별한 규칙이 없어 다른 서비스에서는 이해하기 어렵기 때문에 합의가 필요합니다.
ex) 이메일은 "email"에 저장한다, "admin"으로 관리자를 구별한다.
공개 클레임은 IANA에 등록된 JWT의 표준 클레임으로 다른 서비스에서도 동일한 의미를 가져 합의가 필요하지 않습니다.
"iss": "http://almon.auth.com",
iss(Issuer)는 토큰이 만들어진 서비스를 의미합니다.
"sub": "almon",
sub(Subject)는 사용자나 주제를 의미합니다. ex) 사용자의 ID
"aud": "http://almon.test.com",
aud(Audience)는 수신자를 의미합니다. ex) 토큰을 받는 서비스의 도메인
"iat": time(),
iat(Issued At)는 토큰이 발행된 시간을 의미합니다.
"nbf": time() + 10,
nbf(Not Before)는 설정된 시간 이전에는 토큰이 유효하지 않다는 의미입니다.
time() + 10은 10은 토큰이 발행된 시간에서 10초 이후부터 토큰이 유효하다는 의미입니다.
"exp": time() + 3600,
exp(Expiration Time)는 만료시간이라는 의미입니다.
time() + 3600은 발행시간 이후 1시간 동안 토큰이 사용 가능하다는 의미입니다.
서명(Signature)
- 헤더와 페이로드를 비밀키로 암호화한 부분입니다.
- 서버에서 서명을 이용해서 토큰의 무결성을 검사합니다.
$signature = HS256(base64_encode($header).".".base64_encode($payload), $scret_key);
Signature는 헤더와 페이로드를 Base64 URL인코딩을 거친 뒤 특정한 알고리즘과 비밀키로 암호화해서 만들어집니다.
토큰을 받아와 서명을 검증하는 순서는 아래와 같습니다.
- 토큰에서 헤더와 페이로드를 가져옵니다.
- 헤더와 페이로드에 비밀키를 더해줍니다.
- 헤더 + 페이로드 + 비밀키를 암호화 알고리즘으로 암호화합니다.
- 만들어진 값을 서명과 비교합니다.
JWT를 사용하는 이유
Stateless(상태 비저장)
JWT이전에는 세션방식을 많이 사용했지만 세션 방식은 서버에서 유저의 상태를 계속 저장하고 있기 때문에 유저가 많을수록 서버의 성능이 떨어지는 문제가 있었습니다. 그에 비해 JWT는 클라이언트에 저장되기 때문에 서버의 자원을 사용할 필요가 없습니다.
자체 포함 (Self-contained)
세션은 세션ID를 클라이언트로 받아온 뒤 서버에서 따로 세션파일을 열어 정보를 조회해야 했습니다. 하지만 JWT는 토큰에 사용자의 정보가 담겨 있기 때문에 따로 서버에서 정보를 조회할 필요가 없습니다.
참고
'모의해킹 > 모의해킹' 카테고리의 다른 글
자바스크립트로 키로거 만들기 (2) | 2024.11.07 |
---|---|
모의해킹 공부 (4주차 강의 정리) (2) | 2024.11.07 |
모의해킹 공부 (3주차 강의 정리) (0) | 2024.10.31 |
모의해킹 공부 정리 13일차 (쿠키와 세션) (0) | 2024.10.29 |
모의해킹 공부 정리 9일차(미니 미션) (0) | 2024.10.25 |