멘토님께서 지난 멘토링 때 하셨던 말씀 ..!! 요즘 JWT는 기본으로 사용한다고 ... 일단 Oauth 사용해볼 시간이 부족할 것 같아서 JWT로 1차 구현을 진행하고 있었는데 강사님께서 토큰 보안 강화를 위해 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 둘 다 유출되면 이 경우는 막을 수 없게 된다. 둘 중 하나만 유출된 경우에는 막을 수 있었다. 이 문제는 일단 뒤로 하고 일단 생각해본 구조는
이런 흐름이다!
우선, refresh token 만을 가지고 진행한다면, access token이 만료된 상태가 아니거나 refresh token 만을 탈취한 해커일 수 있다. 따라서 이전 access token, refresh token 쌍을 검사하는 편이 좋다고 생각했다.
그리고 토큰 갱신을 위해 두 토큰을 전부 보내기 때문에, 갱신 후에는 access token 뿐만 아니라 refresh token 도 새로 발급받아 전송했다.
그리고 데이터베이스에 저장된 토큰 쌍과 클라이언트로부터 전달받은 토큰 쌍이 일치하지 않으면, 데이터베이스에 저장된 토큰 쌍은 삭제되고 새로 로그인을 해서 다시 토큰 쌍을 발급받아야 한다.
이렇게 하면 ... 우선 하루동안 고민해본 보안 관련 이슈는 끝! 구현 시작!
순수웨딩 - JwtAuthenticationFilter.java 에서 확인하는 것으로 ....