본문 바로가기
SPRING

[Spring] JWT 실습 - 1

by 킹명주 2022. 7. 27.

이 때까지 Spring에서 로그인 실습을 많이 다루어보았다. 그래서 이번에는 간단한 로그인 실습이 아닌 JWT를 활용한 정식 로그인을 개발해보는 것으로 결정했다. 그러므로 JWT란 무엇이고 어떻게 사용하는지 숙지할 필요가 있다.


JWT 란?

Json Web Token 약자로 모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰이다. 쉽게말해 웹 상의 정보를 Json 형태로 주고 받는 것인데 이 때 표준규약에 따라 생성한 암호화된 토큰으로 복잡하고 읽을 수 없는 String 형태로 저장되어 있다.


 

JWT 구성

 

JWT는 헤더(header), 페이로드(payload), 서명(signature)로 구성되어 있다. (아래 그림 참고)

  • 헤더 (Header)
    어떠한 알고리즘으로 암호화 할 것인지, 어떠한 토큰을 사용할 것 인지에 대한 정보가 들어있다.
  • 정보 (Payload)
    전달하려는 정보가 들어있다. 이 때 이러한 정보의 일부를 Claim이라고 부른다. Claim은 크게 3종류로 여러 Claim을 넣어 Payload를 구성할 수 있다.

       1. Registered Claim

           1.1 iss - 토큰 발급자

           1.2 sub - 토큰 제목

           1.3 aud - 토큰 대상자

           1.4 exp - 토큰 만료시간

           1.5 nbf - Not Before를 의미, 토큰의 활성 날짜

           1.6 iat  - 토큰이 발급된 시간

           1.7 jti - JWT 고유 식별자, 중복 처리 방지

 

       2. Public Claim

           공개용 정보를 위해 사용된다. 충돌 방지를 위해 URI format을 유지한다.

   

       3. Private Claim

          client <-> server 간 사용되는 claim 이름이다. 중복으로 인한 충돌이 발생할 수 있으니 사용할 때 유의해야 한다.

 

  • 서명 (Signature)
    가장 중요한 부분으로 헤더와 정보를 합친 후 발급해준 서버가 지정한 secret key로 암호화 시켜 토큰을 변조하기 어렵게 만들어준다.

위 설명을 참고해서 정보를 작성했다. 이 작성된 정보를 담게되면 아래와 같은 토큰으로 발급하게 되는 것이다.

 

해당 실습은 https://jwt.io 사이트를 통해 수행할 수 있다. JWT 개념도 알게되었으니 이를 어떻게 활용해서 로그인을 진행할 것인지 설명하고자 한다.


로그인에 JWT 적용하기

 

우선 간단하게 그림으로 표현하고자 한다.

 

 

client에서 로그인을 하기 위해 서버에 로그인 요청을 보내게 된다. 그러면 서버에서 가장 먼저 로그인이 유효한지 DB에서 검증한다. 만약 유효한 로그인이 맞다면 해당 유저의 고유 access token과 refresh token을 발급한다. access token은 유효기간이 짧은 토큰으로, 이를 활용하여 계속해서 확인하는 작업을 수행한다. refresh token은 유효기간이 긴 토큰으로 DB에 저장한다. 이후 로그인 상태를 유지하기 위해 client에서 앞서 발급받은 토큰 중 access token만 jwt에 포함하여 데이터를 전송한다. 서버에서 jwt 데이터를 검증 후 결과를 전송한다. 이 때 accss token이 문제가 없다면 로그인을 유지할 수 있다. 그러나 다음과 같은 문제가 발생할 수 있다.

  • access token이 다름 => 이 경우 외부 접근으로 판단하면 된다.
  • access token 유효기간이 끝남 => 이 경우 사용자는 아래와 같은 과정을 거쳐야 한다.

refresh token은 앞서 짧게 언급했는데 단순히 생각하면 유효기간이 긴 jwt 토큰이라고 생각하면 된다. 이는 DB에 저장해두고 짧은 유효기간을 가진 access token의 유효기간이 종료되었을 때 client에서는 refresh token을 전송하고 server는 DB에서 확인 후 token이 동일하다면 새로 access token을 발급해서 전송한다.

그렇다면 이러한 궁금증이 생길 수 있다.

refresh token의 유효기간이 만료되었을 때는 어떻게 하나?

이는 매우 간단하게 처리할 수 있다. refresh token의 유효기간이 만료된 경우에는 client를 로그아웃 시키면 된다. 로그아웃을 시키고 DB에 저장되어 있는 refresh token을 delete 해주면 된다. 그러면 이 사용자는 새롭게 로그인 요청을 하게될 것이고 위의 과정을 다시 거치게 될 것이다.


access token, refresh token 이라는 개념이 갑자기 나와 혼란스러울 수 있지만 그냥 이름을 이렇게 지은 것이지 단순하게 생각하면 유효기간이 긴 것과 짧은 jwt 토큰이라고 생각하면 된다. 다음 시간에는 이를 활용해서 spring 코드를 구현해볼 예정이다.

'SPRING' 카테고리의 다른 글

[Spring] Google Login API 사용하기  (12) 2022.10.10
[Spring] JPA CASCADE  (2) 2022.08.31
[JAVA] JPA 연관관계 매핑  (0) 2022.07.25
[JAVA] JPA 실습(Create table and PK/FK 설정)  (0) 2022.07.19
[JAVA] JPA 개념 및 예제  (0) 2022.07.18