유동근 - 2024년 06월 28일
infomationJWT(Json Web Token)란?
클라이언트와 서버 간에 통신할 때 사용자 인증과 권한 부여를 위해 사용된다. 웹 상에서 정보를 Json 형태로 주고 받기 위해 생성한 암호화된 토큰으로 복잡하고 읽을 수 없는 string 형태로 저장돼있다.
JWT의 구성 요소
헤더(Header)
- 토큰 유형(”typ”)과 해싱 알고리즘(”alg”) 지정
{
"alg": "HS256",
"typ": "JWT"
}
페이로드(Payload)
- 전달하려는 정보(클레임)가 들어있다.
- 누구나 읽을 수 있기 때문에 민감한 정보를 담으면 안된다.
{
"sub": "1234567890",
"name": "DongGeun",
"admin": true
}
클레임의 유형 3가지
-
등록된 클레임
- 토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터들
- 모두 선택적으로 작성 가능
iss 토큰 발급자 sub 토큰 제목 aud 토큰 대상자 exp 토큰 만료 시간 nbf 토큰 활성 날짜 iat 토큰 발급 시간 jti JWT 토큰 식별자 - 공개 클레임
- 사용자 정의 클레임
- 공개용 정보를 위해 사용
- URI 포맷 사용 ⇒ 충돌 방지 위함
- 비공개 클레임
- 사용자 정의 클레임
- 서버와 클라이언트 사이에 임의로 지정한 정보 저장
서명(signature)
- 헤더와 페이로드를 합친 후 지정된 비밀 키로 해싱하여 생성 ⇒ 토큰의 무결성 확인 가
작동 원리
- 사용자가 로그인하면 서버는 사용자의 신원을 확인하고 JWT 생성해서 클라이언트에게 전달
- 클라이언트는 이후 요청에서 이 JWT를 HTTP 헤더에 포함시켜 서버로 보낸다.
- 서버는 전달된 JWT의 서명을 검증해 토큰을 확인하고 페이로드의 클레임을 통해 사용자의 권한을 확인
장점과 단점
장점
- 서버측 부하를 낮출 수 있고 독립적이라서 능률적으로 접근 권한 관리 가능하다.
- 별도의 인증 저장소가 필요하지 않아서 인증서버와 db에 의존하지 않아도 된다.
단점
- 서버로부터 받은 토큰이 쿠키, 로컬스토리지, 세션스토리지에 저장되므로 탈취당할 위험이 있다. ⇒ token에 중요 정보 넣으면 안됨.
- 토큰에 넣는 데이터 많아질수록 토큰 길어짐. ⇒ API 호출할 때마다 토큰 데이터 서버에 전달해야하므로 네트워크 대역폭 낭비가 심할 수 있다.