JTW(Json Web Token) 토큰이란?
클라이언트와 서버, 서비스와 서비스 사이 통신 시 권한 인가(Authorization)를 위해 사용하는 토큰
사용자 인증 과정(authentication)에서 "로그인한 사용자 = 실제 서버로 request를 요청한 사용자"의 일치 여부를 확인하여 권한을 부여하는 authorization의 개념에 해당된다.
1. JWT token의 구조
- Header(헤더) : Algorithm(알고리즘) + Token Type(토큰 타입)
- Payload(페이로드) : Data(데이터)
- Signature(서명)
2. JWT token 사용 여부로 살펴보는서버 작동 방식 차이
- 기존 로그인 방식(session based server) : 서버 메모리의 세션에 유저 정보를 저장하고, 해당 세션 ID를 쿠키로 전송한다.
서버에 관련 정보들이 저장된다.
- JWT 토큰을 사용한 로그인 방식 : 유저에게 암호화된 JWT토큰을 부여해서 브라우저로 해당 토큰을 전송한다.
JWT토큰을 사용할 경우 서버에는 아무 정보도 저장되지 않는다. JWT토큰에 모든 user정보가 저장되어 있다.
JWT의 장단점
JWT의 장점
- JWT 의 주요한 이점은 사용자 인증에 필요한 모든 정보는 토큰 자체에 포함하기 때문에 별도의 인증 저장소가 필요 없다.
- 쿠키를 전달하지 않아도 되므로 쿠키를 사용함으로써 발생하는 취약점이 사라진다.
- URL 파라미터와 헤더로 사용
- 트래픽 대한 부담이 낮음
- REST 서비스로 제공 가능
- 내장된 만료
- 독립적인 JWT
JWT 단점 및 고려사항
- Self-contained: 토큰 자체에 정보를 담고 있으므로 양날의 검이 될 수 있다.
- 토큰 길이: 토큰의 페이로드(Payload)에 3 종류의 클레임을 저장하기 때문에, 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.
- Payload 인코딩: 페이로드(Payload) 자체는 암호화 된 것이 아니라, BASE64로 인코딩 된 것이다. 중간에 Payload를 탈취하여 디코딩하면 데이터를 볼 수 있으므로, JWE로 암호화하거나 Payload에 중요 데이터를 넣지 않아야 한다.
- Stateless: JWT는 상태를 저장하지 않기 때문에 한번 만들어지면 제어가 불가능하다. 즉, 토큰을 임의로 삭제하는 것이 불가능하므로 토큰 만료 시간을 꼭 넣어주어야 한다.
- Tore Token: 토큰은 클라이언트 측에서 관리해야 하기 때문에, 토큰을 저장해야 한다.
JWT 인증 방식
대략적인 JWT를 사용한 인증이 흐름은 아래와 같다.
- 헤더 or 페이로드가 변조되지 않았는지 확인한다.
- 페이로드가 만료일(exp) 등에 문제가 없는지 확인한다.
- 문제가 없으면 인증이 완료된다.
로그인 이전
- 클라이언트에서 사용자 정보(id, pw 등)을 요청한다.
- 서버에서 받은 id와 pw 검증을 한다.
- 검증이 되었다면, 개인 키 JWT 발행한다.(인증 된 사용자 정보와 유효 기간을 포함한다.)
- 발행한 JWT를 HTTP응답 헤더 Cookie에 담아 클라이언트에 반환한다.
- 로그인이 완료된다.
로그인 이후
- 클라이언트에 LocalStorage에 토큰이 있는지 확인한다.
- 토큰이 있다면, 그 유효 기간을 확인하고 HTTP 헤더에 넣어 서버에 요청한다.
- 유효 기간이 끝났다면, 서버에 요청하고 서버에서는 토큰을 갱신(새로 고침)하여 반환한다.
- 클라이언트에서는 처음 등록할 때와 마찬가지로 돌아온 토큰을 LocalStorage에 저장한다.
- 토큰이 없다면, 사용자에 따라 적절한 페이지로 리다이렉트한다.
- 서버에서 비밀 키(secret-key)를 사용하여 받은 JWT가 손상되지 않았는지 확인하고, 만료되지 않았는지 확인한다.
- 토큰이 유효하다면, 그대로 처리를 계속 필요에 따라 클라이언트에 데이터를 반환한다.
- 토큰이 유효하지 않으면, 인증 오류를 클라이언트에 응답한다.
참고 : 링크텍스트