기술정보

[ JWT ] JWT를 활용한 로그인

quantumee 2023. 11. 27. 11:53

JWT  (  Json web Token ) 

 Json web Token의 약자이다.

이름 그대로 json형태로 웹에서 사용하는 토큰이다.

JWT는 기존의 세션에서 관리하던 로그인 정보를 클라이언트가 관리하도록 설계한 정보 관리 방식이다.

이렇게 세션을 사용하지 않으면서 server 부담을 최소화하려는 방식을 stateless 방식이라 한다.

 

stateless 방식대로 JWT는 일반적으로 쿠키에서 관리되며 쿠키 속에 있는 토큰으로 회원의 권한관리를 진행한다.


1. JWT의 종류

JWT는 acess토큰과 refresh 토큰으로 나뉘어진다.

 

Access Token (필수)

서비스에서 직접적으로 사용자의 인증과 권한 관리를 위해 사용하는 토큰이다.

항상 client가 가지고 다니며 인증이 필요한 순간 마다 이를 사용해 권한을 부여받는다.

 

이러한 Access Token은 세션에 저장해서 권한 관리를 할때보다 보안에 취약하고 탈취 당했을 경우 개발자가 조치를 해줄 수 없기 때문에 일반적으로 Access Token의 만료기한을 아주 짧게 제한한다. ( 보통 10분 ~30분 정도 )

 

Refresh Token ( 선택 )

Access Token의 짧은 유효기간을 보완하기 위해 생겨난 토큰이다. 

Access Token의 유효기간이 끝날 때면 Refresh Token에 요청해 Access토큰을 자동으로 재발급 해주는 용도로 사용된다. 

물론 JWT방식으로 로그인한 사용자는 access토큰의 만료와 재발급을 인지 할 수 없고 백엔드 단에서 조용히 동작한다.

 

이러한 Refresh Token은 Access Token의 짧은 유효기간으로 사용자의 불편함을 줄여주기 위해서 생견난 것이므로

Refresh토큰 자체의 유효기간은 Access Token과 달리 꽤 길게 정한다. ( 보통 짧으면 3시간, 길면 1주일 정도 )

 

토큰의 유효기간이 길어진 만큼 access토큰과 마찬가지로 보안상의 문제가 발생한다. client가 refresh토큰까지 보유하게 된다면 토큰이 탈취되면 아무 조치를 못하는 상태로 Refresh Token의 유효기간이 만료되기만을 기다려야 해커에게 권한을 돌려받을 수 있다.

 

이러한 요소 때문에 기존의 순수한 stateless 방식을 고수하는 개발자는 많이 없다. Refresh Token은 개발자가 세션에서만 관리하거나 세션과 더불어 DB에 저장해두고 사용하는 경우도 있다. 

( 물론, 가벼운 웹 서비스의 경우 순수한 stateless로 개발하는 경우도 많이 있으며 refresh 토큰 자체를 사용하지 않는 경우도 있다. access 토큰은 JWT에서 필수지만 refresh 토큰은 선택사항이다. )

 


2. Token의 저장 장소

Access Token은 client에 저장한다. client의 대표적인 데이터 저장소는 아래 4개일 것이다.

 

1. Session Storage

2. Local Storage

3. Front단의 변수

4. Cookies

 

각 저장소는 장단점을 가지고 있다.

 

1. Session Storage

   장점 :

        - 간편하게 저장 및 불러오기가 가능하다.

   단점 :

        - 브라우저의 탭이 달라질 경우 값을 불러올 수 없다. ( 데이터 공유의 확장성이 떨어짐 )

 

2. Local Storage

   장점 :

        - 간편하게 저장 및 불러오기가 가능하다.

        - 같은 브라우저라면 로그인 정보를 공유할 수 있다. ( session Storage보다 데이터 공유의 확장성이 좋음 )

   단점 : 

        - Session Storage보다 보안에서 취약하다.

 

3. Front단의 변수

   장점 :

        - 간편하게 저장 및 불러오기가 가능하다.

        - 같은 client라면 로그인 정보 유지를 할 수 있다.

   단점 : 

        - 간혹 페이지 이동 혹은 새로고침 등을 실행 할 때 변수 속 데이터가 유실되는 경우가 생긴다.

        - 페이지 이동 혹은 기능 동작 때 변수 내의 값이 유실되지 않도록 정확하게 설계해야한다.

        - Front 단이 무거워져 client의 성능 저하를 유발할 수 있다.

 

4. cookies

   장점 :

        - 한번 쿠키 속에 데이터를 넣어주기만 하면 추가적인 작업이 필요없다.

            ( ㄴ server에서 쿠키를 저장하면 알아서 client에도 적용된다.)

        - 보안 면에서 가장 안전하다.

   단점 :

        -  최근 브라우저 운영 정책 변경으로 client에서 쿠키를 제대로 사용하려면 ssl인증을 해서 https로 환경을 바꿔야한다.

            ( 로컬 환경에서 개발중일 때는 문제가 없으나 추후에 배포시 문제가 발생한다.

          서버에서 쿠키로 토큰 발급을 했지만 클라이언트로 쿠키가 이동하지 못하는 문제가 발생한다. )  


 

 3. JWT의 구조 ( 내부 정보 )

*** 추후 작성 예정