JWT (JSON Web Token)는 웹에서 사용자 인증 및 정보 전송을 위해 사용되는 개방형 표준이다. 분산 시스템, API 인증 및 사용자 인증에 자주 사용된다.
JWT의 구성
JWT는 세 부분으로 구성되어 있다.
1. 헤더 (Header): 토큰의 종류와 서명 알고리즘 정보
2. 페이로드 (Payload): 토큰에 담고자 하는 실제 데이터 (예: 사용자 정보) 암호화되지 않아서 쉽게 디코딩 가능
3. 서명 (Signature): 토큰의 무결성을 보장하기 위해 사용. 비밀 키나 공개/비공개 키 페어를 사용하여 생성
각 부분은 base64url로 인코딩되어 .(점)으로 구분된 하나의 문자열로 결합
JWT의 전체적인 흐름
1. 로그인:
- 사용자가 로그인하면 서버는 사용자의 정보를 확인한 후 JWT 토큰을 생성한다.
- 이 토큰은 사용자의 ID, 권한, 발급 시간, 만료 시간 등 중요한 정보를 포함한다.
- 이 JWT 토큰은 사용자에게 반환된다.
2. API 요청:
- 사용자는 API 요청을 할 때 HTTP 헤더에 JWT를 포함시킨다.
- 예) `Authorization: Bearer <JWT>`
3. 서버에서 JWT 검증:
- 서버는 요청을 받으면 헤더에서 JWT를 추출하고, 서명과 만료 여부를 확인하여 이 토큰이 유효한지 검증한다.
- 서명이 유효하고 토큰이 만료되지 않았다면, JWT에 담긴 정보를 이용해 사용자를 인증하고 요청을 처리한다.
4. 응답:
- 서버는 요청을 처리한 후 적절한 응답을 반환한다.
JWT 구조 상세 설명
1. 헤더 (Header)
- 알고리즘 (Algorithm): 서명을 생성할 때 사용하는 알고리즘 (예: HS256, RS256 등)
- 타입 (Type): JWT라는 토큰 타입을 명시
예시:
{
"alg": "HS256",
"typ": "JWT"
}
2. 페이로드 (Payload)
페이로드는 사용자의 정보나 데이터를 포함하는 부분
예) 사용자 이름, id 권한 정보 등
이 데이터는 암호화되지 않기 때문에 누군가 쉽게 읽을 수 있다.
예시:
{
"sub": "1234567890", // 사용자 ID
"name": "홍길동",
"iat": 1516239022 // 발급 시간
}
3. 서명 (Signature)
서명은 JWT의 무결성을 보장
서명은 헤더와 페이로드를 결합한 뒤, 비밀 키나 공개/비공개 키 페어로 서명하여 생성된다.
이 서명은 JWT의 내용이 변조되지 않았는지 확인하는 데 사용된다.
서명 생성 방식 (예: HS256)
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secretKey)
JWT 검증
서명 검증이란, 서버가 받은 JWT가 실제로 신뢰할 수 있는 토큰인지 확인하는 절차
이를 통해 클라이언트가 보낸 JWT가 변조되지 않았고, 유효한 토큰인지 판단할 수 있다.
서명 검증 과정:
1. JWT 토큰을 디코딩하여 헤더, 페이로드를 추출한다.
2. 서명 부분을 검증한다.
- 서버가 가지고 있는 비밀 키 또는 공개 키로 JWT 서명을 확인한다.
- 서명이 유효하면 토큰이 변조되지 않았다는 것을 보장한다.
3. 만료 시간 (exp)을 확인하여 토큰이 아직 유효한지 확인한다.
JWT 사용하는 방법
1. 로그인 시 JWT 발급
- 사용자가 로그인하면, 서버는 사용자 정보를 바탕으로 JWT를 생성한다.
- JWT를 클라이언트(사용자)에게 전달한다.
2. JWT를 사용한 인증
- 사용자는 API 호출 시, HTTP 헤더에 JWT를 포함시켜 요청한다.
3. 서버에서 JWT 검증
- 서버는 JWT를 받아서 서명 검증, 만료 시간 확인 등의 과정을 거쳐 유효한 토큰인지 확인한다.
- 유효한 토큰이면 요청을 처리하고, 그렇지 않으면 인증 오류를 반환한다.
'백엔드 공부일지' 카테고리의 다른 글
MVC(Model-View-Controller) 패턴 (0) | 2024.06.02 |
---|---|
프로젝트 아키텍처 (0) | 2024.05.30 |