목록전체 글 (78)
개발자
spring security와 jwt 를 이용하여 로그인을 구현하고 토큰 재발급, redis를 활용한 로그아웃, 최신토큰 사용하기 등등 다 구현을 해보았는데요. reids활용한 구현부분은 flow를 정리해놓았는데 jwt를 이용한 로그인와 토급재발급의 동작 flow에 대한 설명이 부족한것 같아서 추가로 포스팅을 작성하려고 합니다. 이 포스팅은 jwt를 이용한 로그인과 토큰 재발급의 동작 흐름에 관한 글이기 때문에 구현방법은 이전포스팅들을 참고해주시기 바랍니다. 들어가기 앞서 OncePerRequestFilter가 아니더라도 일반적인 GenericFilterBean을 상속받아도 무관합니다. (OncePerRequestFilter가 이미 GenericFilterBean를 상속받고 있기 때문.) Filter 작..

프로젝트 진행중 loval,dev,test 환경으로 DB를 분리해야 할 일이 생겼습니다. test 코드 수행이 끝난 뒤 모든 데이터가 지워져서 DB가 클린상태가 되어야 하는데 그렇게 되면 API 테스트시 DB의 기존 데이터들이 모두 삭제되는 문제가 발생했습니다. 때문에 TEST용 DB를 따로 분리해주기로 했습니다. aplication.yml을 분리해서 사용할 건데요, aplication.yml이란 무엇일까요? aplication.yml 이란? application.yml은 주로 스프링 부트(Spring Boot) 애플리케이션에서 사용되는 설정 파일입니다. 스프링 부트는 자바 기반의 웹 애플리케이션을 쉽게 개발할 수 있도록 도와주는 프레임워크로, 이를 통해 애플리케이션의 설정을 관리할 수 있습니다. app..

이전 포스팅에 이어서 이번에는 redis를 이용해서 로그아웃을 구현해 보겠습니다. balckList를 사용한다고 하는데요 말은 blackList지만 실제로 사용할 때는 redis에 해당토큰을 set해서 blackList로 등록해주고 리소스 접근시 balckList에 해당 토큰이있다면 로그아웃 처리되었기 때문에 리소스 접근이 안되는 것입니다. flow를 살펴봅시다. 로그아웃 flow는 이렇게 진행됩니다. 핵심은 accessToken을 BalckList에 등록해주고 refreshToken을 삭제해서 해당 토큰으로 로그인할 수 없도록 로그아웃처리를 해줍니다. 그래서 해당 리소스에 요청할때 로그아웃처리된 토큰이 온다면 redis에서 blackList를 확인하여 해당 토큰이 있다면 로그아웃된 토큰이므로 리소스에 ..

JWT를 구현하는 중에 문제가 생겼다. JWT는 만료시킬 수 없어 재사용하거나 계속 발급해주는 방법이있는데 재사용은 보안문제가 있어 로그인 API접근시 마다 새로운 토큰을 발급해주는 방법을 사용했었다. 나는 accessToken과 refreshToekn을 모두 재발급 해주는데 accessToken만료시에도 refreshToken 검증후 accessToken을 재발급 해주는데 이때 refreshToken도 함께 재발급이 된다. 그렇다면 계속해서 발급하는 토큰들 어떻게 되는거지? 유효시간이 만료되서 사용불가능하게 되지않으면 이전에 발급한 토큰들로도 계속 로그인이 가능하다. accessToken의 경우 유효시간이 짧지만 refreshToken의 경우는 유효기간이 길어 문제가 될 수 있다. 그렇다고 refres..

저는 이번 프로젝트를 JWT 방식을 사용해서 진행했습니다. 그렇다면 왜 JWT를 적용했는지 알아봐야겠죠. JWT는 토큰 기반 인증입니다. 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함됩니다. JWT가 등장하기 전에는 웹에서 쿠키(cookie)와 세션(session)을 이용한 사용자 인증을 구현하는 경우가 많았는데요. JWT는 어떤 장점이 있어 많이들 사용하는 걸까요? 아마도 가장 큰 이유는 확장성에 있을 것 같은데요. JWT는 토큰 자체에 사용자의 정보가 저장되어 있어있기 때문에 서버 입장에서 토큰을 검증만 해주면 됩니다. JWT와 같은 토큰을 클라이언트에 저장하고 요청시 HTTP 헤더에 토큰을 첨부하는 것만으로도 단순하게 데이터를 요청하고 응답을 받아올 수 있게 되는 겁니다. 다..

이제 spring security의 작동원리에 대해 알아보았고 JWT를 이용해서 로그인을 구현하는 방법을 알아보겠습니다. 스프링 시큐리티는 기본적으로 세션을 기반으로 한 인증이 진행되는데, JWT(Json Web Token)는 말그대로 토큰을 이용하여 인증을 처리하게 됩니다. 세션과 토큰의 차이점과 토큰을 이용해서 로그인을 구현하게 된 이유는 추후 포스팅한 후 링크를 걸겠습니다. JWT 란? JWT는 일반적으로 클라이언트와 서버 통신 시 권한 인가(Authorization)을 위해 사용하는 토큰입니다. Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token으로 JSON 객체를 사용하여 토큰 자체에 정보를 저장하는 Web Token입니다. JWT는 토큰 자체를 정보로 사..

JWT 토큰을 이용해서 로그인을 구현하기 전 스프링 시큐리티를 먼저 적용해려보려고 합니다. 저번 포스팅에서 암호화할때 스프링 시큐리티를 다뤘지만 동작원리는 다른 블로그로 갈음했었는데요. 확실히 동작원리를 알고있지 않으면 원하는대로 필터나 인터셉터등을 커스텀하기가 어렵습니다 . 때문에 이번 포스팅에서 스프링 시큐리티 동작원리를 자세히 살펴도록 합시다 스프링 시큐리티란? 스프링 시큐리티 (Spring Security)는 스프링 기반 어플리케이션의 보안(인증과 권한, 인가)을 담당하는 스프링 하위 프레임워크입니다. 보안과 관련해서 체계적으로 많은 옵션들을 제공해주기 때문에 개발자의 입장에서는 하나하나 보안 관련 로직을 작성하지 않아도 된다는 장점이 있습니다. 저번 포스팅 에서 썻듯이 시큐리티는 인증과, 인가가..

Spring Security를 구현하면서 그 동작원리를 이해하기 위해서는 Spring boot에서 request요청이 들어왔을때 어떤 단계로 처리되는지를 알아야 할 필요가 있다. 구현하는데 급급해서 구현했지만 이론을 잘 모르니 필터나 커스텀이필요한 클래스들을 찾지못해 난감한 경우가 많았다. 차근차근 처리단계부터 공부를 시작해보자. 요청이 들어오면 위의 그림처럼 처리되는 흐름이다. 하지만 실제로는 Interceptor가 Controller로 요청을 위임하지는 않으므로, 아래의 그림은 처리 순서를 도식화한 것으로만 이해하고 자세한건 아래에서 살펴보자. 1. Filter 2. DispatcherServlet 3. Interceptor 4. Controller 이런 단계를 거쳐 controller를 지나게 되는..

로그인을 구현하기 앞서 패스워드를 먼저 암호화해줄 필요가 있어졌다. 이번 로그인은 spring secutiry를 이용해 구현해줄 것이기 때문에 패스워드도 spring security를 이용해서 해보겠다 Spring Security가 뭐지? Spring Security는 Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크이다. Spring Security는 '인증'과 '권한'에 대한 부분을 Filter 흐름에 따라 처리하고 있다. Filter는 Dispatcher Servlet으로 가기 전에 적용되므로 가장 먼저 URL 요청을 받지만, Interceptor는 Dispatcher와 Controller사이에 위치한다는 점에서 적용 시기의 차이가 있다. Spring..

저번 포스트에 이어서 이번포스팅에는 멀티모듈로 프로젝트 구조를 직접 바꿔보겠습니다 저번 글에 있듯이 저의 원래 프로젝트 구조는 이렇게 되어있습니다. 루트 모듈 하나만 존재하는 상태. 이제 모듈을 나누기 전에 루트 모듈에있는 build.gradle 파일을 변경해 줍니다! plugins { id 'java' id 'org.springframework.boot' version '2.7.8' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } repositories { mavenCentral() } subprojects { group = 'workFlow.WFrefactoring' version = '0.0.1-SNAPSHOT' sourceCompa..