Spring(52)
-
스프링의 Layered Architecture와 폴더 구조
[ 스프링의 Layered Architecture ] React는 라이브러리, Vue는 프레임워크, 스프링도 프레임워크라고 한다. 라이브러리와 프레임워크의 기본적인 차이는 제어의 권한을 누가 가지고 있는가에 따라 구분할 수 있다. 일반적인 Java 코드에서 Jackson라이브러리의 경우 그 코드는 도구이며 전체적인 흐름은 개발자가 직접 선택해서 정한다. 반면 스프링에서는 전체적인 흐름은 스프링에서 정해져 있고 최대한 역할을 분리할 수 있게 layered architecture 구조로 코드를 짜게 강제한다. 이런 구조의 장점 중 하나를 꼽아보라고 생각하면 컨트롤러 층이 가장 먼저 떠오른다. 특히 컨트롤러에서 우리는 @Request와 @Response를 어떻게 처리할 지만 따로 처리만 한다. 개발자가 직접 ..
2024.03.27 -
스프링 시큐리티 4. 로그인 정보 갱신(RefreshToken 구현)
[ 리프레시 토큰과 구현 로직 설명 ] 3편에서 JWT 토큰을 이용한 로그인 이후 발급되는 AccessToken를 유저에게 주었다. JWT 토큰의 특성으로 인해 DB 없이 상태유지를 하지 않고도 서명 시스템으로 인해 위조 여부를 판단할 수 있었다. 또한, JWT 토큰 내부 정보로 사용자의 아이디와 권한 정보를 이용해 불필요한 인증과정을 없앴다. 문제는 AccessToken은 강력한 권한을 가지고 있다. 서버 내에 저장되어있지 않기 때문에 AccessToken이 빼았겨버리면 만료시간까지 그 유저의 모든 권한을 공격자가 가질 수 있다. 그렇다고 보안을 위해 만료시간을 줄여버리면 사용자가 로그인을 매번해야 하는 불편함이 있다. 보통 이 문제를 해결하기 위해 RefreshToken과 Redis를 이용한 구현을 ..
2024.03.25 -
스프링 시큐리티와 JPA 변경감지 동작 오작동 해결
[ 고민거리 ] 스프링 시큐리티를 사용하면서 AccessToken을 사용했을 때는 DB 내용이 섞여들어가지 않았었다. 그런데, RefreshToken을 사용하니 필터에 DB 커넥션이 필요한 로직들이 필터 내부에 섞여 들어가기 시작했다. 또한 필터가 영속성 컨텍스트 범위 바깥이라 필터 내부에서 DB에서 찾아온 객체 내부의 값을 변경해도 변경이 반영이 되지 않았었다. 그래서 아래와 같은 코드가 나왔다. JWTTokenValidation.java @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException,..
2024.03.25 -
스프링 시큐리티 - OAUTH2
[ 용어 사항 ] 엔드 유저 서비스 요청을 하는 실제 어플리케이션 단에서 사용자로 서비스 이용 고객으로 생각하면 된다. 클라이언트 서버 React나 Flutter 등으로 만들어진 UI 어플리케이션으로 직접 엔드 유저와 상호작용하는 어플리케이션 서버라고 생각하면 된다. 인증 서버 OAUTH2 인증 시스템에서 인증 관련 정보만 처리해주는 서버라고 생각하면 된다. 리소스 서버 OAUTH2 인증 시스템에서 사용자에 관한 데이터를 가지고 있는 서버이다. 예를 들면 티스토리라면 사용자의 모든 글을 가지고 있는 서버라고 생각하면 된다. [ OAUTH2가 필요한 이유 ] 같은 기업 내의 서비스에서 OAUTH2의 장점 한 기업 내에 OAUTH2를 사용하면 서비스가 확장될 때마다 사용자가 각각의 서비스 별 인증을 위해 I..
2024.03.20 -
스프링 시큐리티 - 필터와 필터 디버깅
[ 스프링 시큐리티 필터 ] 스프링 시큐리티에는 필터라는 기능을 제공한다. 필터는 HTTP 요청이 올 때 작동하며, 필터에서 원하는 값들을 받아서 추가적인 처리를 해줄 수도 있고 문제가 있다면 컨트롤러까지 요청이 오는게 아니라 필터 선에서 요청을 끊어줄 수도 있다. 원하는 값과 내보내는 값은 HTTP 요청에 따른 서블릿 객체를 통해 사용이 가능한데, 그래서 filter를 살펴보면 다음처럼 doFilter()라는 메서드의 파라미터에 HttpServletRequest와 HttpS ervletResponse가 있다. 또한 filterChain은 다음에 어떤 필터에 해당 요청과 응답을 넘겨줄 지 정하는 역할을 한다. 따라서, 매번 필터를 작성할 때마다 어떤 요청에 있는 값을 사용하고 응답에 어떤 값을 전달할 지..
2024.03.18 -
스프링 시큐리티 3. 인가( JWT 기반 Token 인가 구현 )
[ 인증과 인가의 차이 ] 2편이었던 인증 글에서는 로그인을 한 뒤 서버 내에 저장된 정보가 일치하는 것을 확인하는 작업을 진행하였다. 이렇게 인증은 프로그램 자체에 접근 권한이 있는 사용자를 가려내는 과정이다. 반면 인가는 프로그램 자체에 접근 권한이 있는 사람이 인증을 받고, 내부 리소스에 접근을 할 때 그 내부 리소스에 접근할 수 있는 권한 또는 역할에 포함되는가를 살펴보는 과정이다. 그래서 인증은 인가보다 먼저 일어나며 주요 특징을 표로 정리해보면 아래와 같다. Authentication Authorization 시스템에 권한이 있는지 유저의 신원을 확인함 리소스 접근 시 유저에게 권한 또는 역할이 있는지 확인함 인증은 인가보다 우선적으로 일어남 인가는 인증 이후에 일어남 로그인 정보가 필요함 권..
2024.03.17