본문 바로가기

포트폴리오/주차장 서비스(with turu parking)

[포트폴리오/주차장 서비스(with turu parking)] - (3) redis 연동 및 jwt 발급

 

 

 

Github

https://github.com/mii2026/sw15

 

GitHub - mii2026/sw15

Contribute to mii2026/sw15 development by creating an account on GitHub.

github.com

 

 

 

목차
1. 들어가며
2. jwt(Json Web Token
3. redis를 통한 Session관리
4. 마치며

 

 

들어가며

 이번 글은 redis 연동 및 jwt 발급에 관하여 정리해보려고 한다. 참고로 redis와 mysql의 경우 도커 컨테이너를 이용하여 띄웠다. 그렇게 하는 편이 나중에 서비스 배포시에 간단하기 때문에 개발할 때 부터 도커 컨테이너를 이용하였다.

 

 

 

 

 

jwt(Json Web Token)

더보기

 회원 가입 방식으로는 jwt 방식을 채용하였다. 요즘에는 소셜 로그인이라하여 네이버나 카카오, 구글등의 이메일 주소를 통해 회원가입이 가능한 경우가 많은데, 외부 API를 통한 로그인 구현보다는 학습 차원에서 jwt 방식으로 프로젝트가 진행되었다.

 

 

 

JSON 웹 토큰(JSON Web Token)은 선택적 서명 및 선택적 암호화를 사용하여 데이터를 만들기 위한 인터넷 표준이다. - 위키백과

 

 

 

 

 

 위키 백과에는 위와 같이 정의되어 있다. 다시말하면 사용자 인증을 위해 사용하는 토큰 중 하나이다. 다만 그 형태가 Json이고, 인터넷상에서 Json 형태의 데이터를 주고받는 것이 보편적이므로 많이 사용된다고 한다.

 

 

 

 

 

 

토큰에 들어있는 내용

 

 

 

 

  인턴 당시에 주간 보고 발표를 위해 내가 만들었던 발표자료의 일부이다. 좌측을 보면 발급받은 jwt의 내용을 확인할 수 있고, 그것을 복호화한 내용을 우측에서 확인할 수 있다. 복호화된 내용을 보면 유저ID, 토큰 발급시간과 만료시간을 포함하는 데이터들이 들어있는 것을 확인할 수 있다.

 

 

 

 

 

 토큰은 발급 시간으로 부터 1시간 후에 만료가되며 위의 사진에서도 비교해보면 발급시간으로부터 만료시간이 3600초 차이나는 것을 실제로 확인할 수 있다. 서버에서는 저 만료 시간 데이터를 이용하여 토큰이 아직 유효한지를 검사하여 클라이언트의 요청을 수행할 지 무시할지를 판단하게 된다.

 

 

 

 

 

 

 

 

redis를 통한 Session 관리

더보기

 앞서 언급하였듯이 jwt를 이용한 로그인 구현 후 사용자 Session관리, 즉 일종의 캐시 서버 역할을 하기위한 redis를 도커 컨테이너에 띄워서 사용하였다.

 

 

 

 

 

 jwt를 이용하여 사용자의 Session을 관리하기 때문에 jwt값을 저장해두는 곳이 필요하다고 판단하였고, 그에 적합한 것이 redis라고 판단하여 이용하게 되었다.

 

 

 

 

 

 

로그아웃된 토큰이 redis에 저장

 

 

 

 

 클라이언트가 로그 아웃 요청 시 그 값이 redis에 저장된 것을 확인할 수 있다. 익명의 누군가가 로그아웃된 토큰을 탈취하여 서버에 악의적인 명령을 요청 시 서버는 먼저 redis에 저장된 로그아웃된 토큰 값 중 일치하는 토큰이 있다면 이 토큰은 유효하지 않다고 판단하여 해당 명령을 무시하게 된다. 

 

 

 

 

 

로그아웃된 토큰으로 명령 시

 

 

 

 

 만약 로그아웃된 토큰으로 서버에 요청 시 위와 같이 예외 처리되는 것을 확인 할 수 있다.

- TEST(with postman)

더보기

회원가입 후 로그인, 서버로 요청 전달까지의 과정을 PostMan을 이용하여 간단하게 테스트하였다.

 

 

 

 

회원가입(좌) 로그인(우)

 

 

 

 

 회원가입 완료 후 로그인 요청 시 서버로부터 토큰이 발급된 것을 확인할 수 있다. 토큰 발급 완료 후 해당 회원과 관련된 명령들을 요청할 수 있게된다.

 

 

 

 

 

 

 

유효하지 않은 토큰에 대한 응답

 

 

 테스트 차원에서 사용자 결제 정보 등록을 테스트해 보았다. 만약 유요하지 않은 토큰으로 유저 정보와 관련된 요청을 보낼 시 위와 같이 유효하지 않은 토큰이라는 response를 받게 된다.

 

 

 

 

 

 

 

유효한 토큰을 넣은 요청에 대한 응답

 

 

 

 

 만약 HTTP 헤더에 서버에서 로그인시에 발급해준 유효한 토큰을 넣어서 요청을 보내게 되면 서버는 토큰을 redis를 통해 검증 후 요청에 따라 작업을 수행하게 된다.  

 

 

 

 

 위 화면에서는 유효한 토큰과 함께 결제수단 등록을 요청하였고 등록된 결제 수단의 정보를 response로 수신하였음을 확인 할 수 있다.

 

 

 

 

 

 

 

 

마치며

 이 글에서는 redis를 띄우고 이를 백엔드 서버와 연동하여 jwt의 유효성을 검증하는 과정에 대해 다루었다. redis에 대해 개념만 알고 있었을 뿐, 실제로 사용해본것은 이 프로젝트에서 처음이었다. 그럼에도 스프링에서 redis 연결과 관련하여 지원하는 API가 잘 구성되어 있어서 어렵지 않게 연동시켜서 사용하였다.