JWT 토큰에 대해 알아보고 로그인을 구현했다.

JWT 토큰이란?

JWT(Json Web Token)은 Json 객체에 인증에 필요한 정보들을 담은 후 비밀키로 서명한 토큰으로, 인터넷 표준 인증 방식이다. 공식적으로 인증(Authentication) & 권한허가(Authorization) 방식으로 사용된다.

여기서 일반 로그인 과정과 인증 방식을 헷갈릴 수 있다. 바로 jwt 프로세스를 살펴보자.

JWT 프로세스

  1. 사용자가 아이디와 비밀번호 혹은 소셜 로그인을 이용하여 서버에 로그인 요청을 보낸다.
  2. 서버는 비밀키를 사용해 json 객체를 암호화한 JWT 토큰을 발급한다.
  3. JWT를 헤더에 담아 클라이언트에 보낸다.

여기까지가 JWT를 발급받기까지의 (로그인 전)과정이다. 로그인 이후에는 다음과 같은 과정이 이루어진다.

  1. 클라이언트는 JWT를 로컬에 저장해놓는다.
  2. API 호출을 할 때마다 header에 JWT를 실어 보낸다.
  3. 서버는 헤더를 매번 확인하여 사용자가 신뢰할만한지 체크하고, 인증이 되면 API에 대한 응답을 보낸다.

그런데 로그인 후에 왜 매번 JWT를 헤더에 넣어서 보내야 할까? 비효율적이라는 생각이 들 수 있다. 매번 인증 과정을 거쳐야하는 이유는 HTTP의 특성 때문이다.

HTTP의 특성

Connectionless : 한 번 통신이 이뤄지고 난 후에 연결이 바로 끊어진다

Stateless : 이전 상태를 유지/기억하지 않는다

인터넷을 사용하는 우리는 HTTP 프로토콜을 사용해서 통신을 한다. 웹 페이지를 열 때도, 핸드폰 어플을 사용할 때도, 클라우드를 사용할 때도 HTTP 통신으로 서버와 클라이언트가 데이터를 주고 받는다. 그런데 이런 HTTP는 connectionless하고 stateless하다는 특성이 있다. 쉽게 설명하면 한 번 통신이 일어나고 나면 연결이 끊어진다는 것이고, 다시 연결해도 이전 상태를 유지하지 않아 과거에 어떤 정보를 보냈었는지 기억하지 못한다는 것이다. 즉, 화면을 이동하며 새로운 API를 요청하면 다시 신뢰할만한 사용자인지 인증하는 과정을 거쳐야하는 것이다.

매번 사용자가 인증하는 과정은 귀찮을 뿐만 아니라 통신이 느려지는 문제가 될 수 있다. 따라서 인증된 사용자가 어느 정도 기간동안 재인증 하지 않아도 되도록(로그인이 유지되도록) 만든 것이 Access Token이다.