728x90
JWT란?
JWT는 인증 방식 중 하나로, 사용자 인증을 위한 토큰(Token) 기반 인증 방식이다.
일반적으로 클라이언트와 서버 사이에서 통신할 때 권한을 위해 사용한다.
Json 형태이며 string 형태로 저장된다.
세션과 달리 서버가 아닌 클라이언트에 저장되기 때문에 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 덜 수 있다.
JWT가 가지는 주요 특징은 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함되어 있다는 것이다. 따라서 데이터가 길어지면 토큰도 길어지게 되며 토큰이 발 번 발급된 이후 사용자의 정보를 바꾸더라도 토큰을 재발급하지 않는 이상 반영되지 않는다.
JWT는 RESTful과 같은 무상태(Stateless)인 환경에서 사용자 데이터를 주고받을 수 있게 된다. 세션(Session)을 사용하게 될 경우에는 쿠키를 통해 식별하고 서버에 세션을 저장하지만, JWT는 토큰을 클라이언트에 저장하고 요청 시 HTTP 헤더에 토큰을 첨부하는 것만으로 데이터를 요청하고 응답받을 수 있다.
JWT의 구성요소
JWT는 헤더(header), 페이로드(payload), 서명(signature) 세 파트로 나뉘어져 있으며, 아래와 같은 형태로 구성되어 있다.
- Header : 어떤 알고리즘으로 암호활 것인지, 어떤 토큰을 사용할 것인지에 대한 정보가 담겨있다.
- Payload: 전달하려는 정보(사용자 id나 email 등을 말하며 클레임[Claim]이라고 표현한다)가 들어있다. payload에 있는 내용은 수정이 가능하여 더 많은 정보를 추가할 수 있다. 그러나 노출과 수정이 가능한 지점이기 때문에 비밀번호와 같은 중요 정보를 담아선 안되며 최소한의 정보(아이디, 이메일 등)만을 담아야 한다.
- Signature: Header와 Payload를 Base64 URL-safe Encode를 한 후 Header에 명시된 해시함수를 적용하고, 개인키(Private Key)로 서명한 전자서명이 담겨있다. 즉 헤더와 페이로드를 암호환 것이라고 생각하면 된다. 이 서명은 비밀키로 서명한 것이기 때문에 공개키로 검증 가능하다. 토큰이 발급된 후에 누군가가 Payload 정보를 수정해도 Signature에는 수정 전 데이터를 기반으로 암호화된 값이 담겨있기 때문에 토큰 악용이 어렵다.
JWT의 동작원리
- 사용자가 id와 password를 입력하여 로그인 요청을 한다.
- 서버는 회원 DB에 들어가 사용자인지 확인한다.
- 확인이 되면 서버는 로그인 요청 확인 후, Secret Key를 통해 토큰(Access Token)을 발급한다.
- 발급한 토큰(Access Token)을 클라이언트에 전달한다.
- 서비스 요청과 권한을 확인하기 위해 헤더에 JWT 데이터를 요청한다.
- 데이터를 확인하고 JWT에서 사용자 정보를 확인한다.
- 클라이언트 요청에 대한 응답과 요청한 데이터를 전달한다.
토큰 기반의 인증 방식은 사용자 인증이 완료된 이후에 토큰을 발급하고 클라이언트쪽으로 전달해준다. 이후 서버에 요청을 할 때마다 토큰을 함께 전달하며 서버는 이 토큰을 통해 사용자 인증을 한다.
클레임 토큰은 일반 토큰에 비해 편리한 부분이 있다. 일반 토큰은 인증을 할 때마다 DB에 접근해서 사용자 정보 등 검증에 필요한 데이터를 확인했어야 했다. 가령 A 사용자의 요청이 들어왔는데 A 사용자의 이메일과 일치한 값이 있는지 확인하기 위해 DB에서 select 해봐야 한다던가~... 하지만 클레임 토큰은 토큰 자체에 사용자 인증에 필요한 정보를 담고 있기 때문에(Payload 부분에) DB에 왔다 갔다 하지 않아도 되고 별도의 인증 저장소가 필요하지 않다. 데이터베이스에 의존하지 않는 쉬운 인증을 제공하기에 일반 토큰 기반 인증에 비해 편리하다고 할 수 있다.
댓글