1.1 JWT 이란?
- 유저를 인증하고 식별하기 위한 토큰(Token)이다.
- JWT는 서버와 클라이언트 간 정보를 주고 받을 때, Http Request Header에 JWT 토큰을 넣어서 전송하며, 서버는 별도의 인증 과정없이 헤더에 포함되어 있는 JWT정보를 통해 인증한다.
- JWS(Json Web Signature)은 JSON으로 전자 서명을 하여 url - safe 문자열로 표현한 것이며 JWE(JSON Web Encryption)은 json을 암호화하여 url-safe 문자열로 표현한 것이다.
1.2 JWT 토큰 구조
: JWT는 세 파트로 나누어지며 순서대로 헤더 , 페이로드 ,시그니처(서명) 으로 이루어져 있다.며. 각 파트는 점으로 구분하여 xxxxx.yyyyyy.zzzzz의 형식으로 표현된다. 각각의 JSON 형태의 데이터를 .을 기준으로 Base64 인코딩 후 합친 형태이다.
헤더(header)
- 헤더는 토큰의 타입(JWT)과 해시 암호화 알고리즘(HMAC, SHA256, RSA)으로 구성되어 있다. 이 알고리즘은 헤더를 암호화 하는게 아니라 서명 즉 Signiture를 해싱하기 위한 알고리즘을 말한다.
- 밑의 예시를 base64로 인코딩하면 -> eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9로 나온다.
{
"alg":"HS256", //서명시 사용하는 알고리즘
"typ":"JWT" // 서명시 사용하는 키를 식별하는 값
}
페이로드(payload)
- 페이로드에는 토큰에 사용자가 담고자하는 데이터가 담겨있다. 각 데이터를 클레임이라고 하며 3가지 종류가 있으며 이는 key-value 형태의 한 쌍으로 이루어져 있다.
- 토큰에는 여러개의 클레임을 넣을 수 있으며. 크게 3가지 종류의 클레임이 존재한다.
- 등록된 클레임(registered claim) : 토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터
- iss : 토큰 발급자
- sub : 토큰 제목
- aud : 토큰 대상자
- exp : 토큰 만료시간
- nbf : 토큰 활성 날짜 - 이 날이 지나기 전의 토큰은 사용불가
- iat : 토큰 발급 시간
- jti : JWT 고유 식별자 - 중복 방지를 위해 사용한다
- 공개 클레임(public claim): 사용자 정의 클레임으로 공개용 정보를 위해 사용하며 충돌방지를 위해 URI 포맷을 이용한다.
- 비공개 클레임(private claim) : 사용자 정의 클레임으로 서버와 클라이언트가 임의로 지정한 정보를 저장한다.
- 등록된 클레임(registered claim) : 토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터
{
"sub": "hyeonsu.jung", // 토큰 제목
"exp": 1623235123,// 토큰 만료 시간
"iat": 1532341234 //토큰 발급 시간
}
서명(signatrue)
- 서명은 헤더와 페이로드를 Base64 URL- safe Encode를 통해 인코딩 한 후 이 인코딩한 값을 secret key를 이용해 헤더에 정의한 알고리즘으로 해싱을 하여 생성한다. 그리고 다시 Base64의 형태로 나타내면 된다.
- Base64 URL-safe Encode : Base 64 Encode에서 URL에서 오류없이 사용하도록 '+', '/' 를 각각 '-', '_' 로 표현한 방식이다.
이렇게 만들어진 헤더.페이로드.서명을 . 기준으로 합치면 하나의 JWT토큰이 만들어진다. 그리고 최종적으로 만들어진 토큰은 HTTP 통신 간 이용되며, Authorization이라는 key의 value로써 사용된다.
1.3 JWT 사용 장/단점
- 사용자 이점에 필요한 모든 정보는 토큰 자체에 포함하기 때문에 별도의 서버에 인증 저장소가 필요없다.
- 토큰은 클라이언트에 저장되어 디비에서 사용자 정보를 조작하더라도 토큰에 직접 적용할 수 없다.
- 토큰 자체 페이로드에 데이터를 저장하기 때문에 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.
- 페이로드 자체는 암호화되지 않고 base64로 인코딩한 데이터이다. 따라서 중간에 페이로드를 탈취하면 디코딩을 통해 데이터를 볼 수 있다. 따라서 페이로드에 중요 데이터를 넣지 않아야 한다.
- 무상태성 - 토큰은 한번 만들면 서버에서 제어가 불가능하다. 따라서 임의로 삭제할수있는 방법이 없기때문에 토큰 만료시간을 꼭 넣어줘야 한다.
'CS > 보안' 카테고리의 다른 글
OAuth 2.0 (Open Authorization) (0) | 2023.03.06 |
---|---|
암호화와 복호화 그리고 양방향 암호화 (0) | 2023.02.14 |