[카테캠 3단계] JWT 보안 강화하기

Seokjun Moon·2023년 10월 14일
0

JWT는 디폴트 입니다.

멘토님께서 지난 멘토링 때 하셨던 말씀 ..!! 요즘 JWT는 기본으로 사용한다고 ... 일단 Oauth 사용해볼 시간이 부족할 것 같아서 JWT로 1차 구현을 진행하고 있었는데 강사님께서 토큰 보안 강화를 위해 refresh token을 도입하라고 하셨다! 그래서 도입해보기로 😤

Refresh Token

JWT 토큰을 2가지로 나눈다. access token, refresh token 이다.

access token : 유효기간이 짧고 평상시 인증을 위해 사용하는 토큰
refresh token : 유효기간이 길고 access token 이 만료되었을 때 새로운 access token 을 발급받기 위한 토큰

따라서 access token 만 사용하다가, 만료된 경우에는 refresh token 으로 새로운 access token 을 발급받아 다시 로그인할 필요 없이 인증 내역을 저장할 수 있는 구조이다.

구현하기에 앞서 생각을 해봤는데, 여전히 보안 문제는 남아있었다. access token과 refresh token 둘 다 유출되면 이 경우는 막을 수 없게 된다. 둘 중 하나만 유출된 경우에는 막을 수 있었다. 이 문제는 일단 뒤로 하고 일단 생각해본 구조는

  1. 로그인을 하면 access token, refresh token 을 전송
  2. 서버는 토큰 쌍을 데이터베이스에 저장
  3. 클라이언트는 access token 만 가지고 인증 진행
  4. access token 의 유효기간 만료
  5. 서버는 refresh token 을 보내라는 응답 전송
  6. 클라이언트는 access token, refresh token 두개를 포함하여 전송
  7. 서버는 클라이언트로 받은 토큰 쌍과 데이터베이스에 저장된 토큰 쌍을 비교
  8. 일치할 경우, 새로운 access token, refresh token을 전송

이런 흐름이다!

왜 이렇게 했을까는

우선, refresh token 만을 가지고 진행한다면, access token이 만료된 상태가 아니거나 refresh token 만을 탈취한 해커일 수 있다. 따라서 이전 access token, refresh token 쌍을 검사하는 편이 좋다고 생각했다.

그리고 토큰 갱신을 위해 두 토큰을 전부 보내기 때문에, 갱신 후에는 access token 뿐만 아니라 refresh token 도 새로 발급받아 전송했다.

그리고 데이터베이스에 저장된 토큰 쌍과 클라이언트로부터 전달받은 토큰 쌍이 일치하지 않으면, 데이터베이스에 저장된 토큰 쌍은 삭제되고 새로 로그인을 해서 다시 토큰 쌍을 발급받아야 한다.

이렇게 하면 ... 우선 하루동안 고민해본 보안 관련 이슈는 끝! 구현 시작!

구현해보자

순수웨딩 - JwtAuthenticationFilter.java 에서 확인하는 것으로 ....

profile
차근차근 천천히

0개의 댓글