진행 중인 프로젝트에서 OAuth2 검증 필터로 OncePerRequestFilter를 상속 받고 빈으로 등록해 사용 중이다 OncePerRequestFilter가 무엇인지는 밸덩을 참고하자 일반 필터와 다르게 이름 그대로 단일 요청에 대해 필터를 단 한번만 타게끔 해주는 녀석이다 OAuth2 검증 필터 흐름은 아래와 같다 1. 사용자의 쿠키에서 ID 토큰을 꺼내와 JWT 파싱 후, issuer를 확인해 구글 토큰인지 확인한다 2-1. 구글 토큰이 아닐 시 필터 체인에 태워 넘긴다 2-2. 구글 토큰일 시 파싱한 정보를 바탕으로 authentication을 만들어 SecurityContextHolder에 넣어준다 3. 만약 토큰의 만료 시간이 지났다면 갱신 url로 forward를 이용해 넘긴다 - 이 ..
OAuth2 로그인을 하더라도 애플리케이션에서 회원 관리를 직접 하고 있다면 CustomOAuth2UserService를 만들어 우리의 DB에 OAuth2 로그인으로 받아온 회원 정보를 넣어줘야 한다 그렇다면 그 설정은 어찌하는가? 흔히 사용하는 SecurityConfig에서 http를 인자로 받는 메서드에서 설정을 잡아준다 수많은 튜토리얼들이 있으니 참고해보시고 최신 버전의 스프링부트 스타터들을 사용한다면 여기까지 설정했을 때 구글 로그인은 customOAuth2UserService를 타지 않는다 왜 내가 만든 커스텀 서비스를 안 타는지 이해 하려면 OAuth2, OIDC (open id connect) 두 방식의 차이를 이해해야 한다 OAuth2는 인가에 초점을 맞췄고 다양한 상황에 쓰일 수 있도록 ..
이 글은 OAuth2 구현을 소개하는 글은 아니다, SpringBoot OAuth2 구현은 이미 훌륭하게 작성된 예제 코드가 많다 구글에 검색했을 때 대부분의 OAuth2 구현은 callicoder.com에서 소개된 예제를 기반으로 만들어져 있다 나도 callicoder.com을 참고해 OAuth2를 구현하였고 코드를 자세하게 이해하기 위해, 또한 가독성 향상을 위해 여러 번의 리팩토링을 거쳐서 코드는 조금 다를지라도 흐름은 거의 비슷하다 아래 블로그는 한국어로 친절하게 설명되어 있어 구현하는데 어려움이 없을 것이다 https://www.callicoder.com/spring-boot-security-oauth2-social-login-part-2/ http://yoonbumtae.com/?p=3000 ..
JWT 기반 인증을 하는 프로젝트를 진행 중에 있다 시간이 부족하거나 작은 규모의 사이드 프로젝트라면 회원가입 관련 파트는 OAuth2를 이용해 간단히 처리할 수 있다 나는 기존에 했던 프로젝트에서 도메인만 남겨두고 설계부터 전부 바꿔 진행하는 중이기 때문에 재미 반 & 학습 목적 반으로 세세한 부분까지 전부 손을 대보고 있다 회원 CRUD는 HATEOAS, Redis 캐시 추상화 때문에 우여곡절이 많았지만 결국 끝냈는데 끝낸 후에 회원 아이디 & 비밀번호 찾기는 어떻게 진행할지 한동안 고민을 했다 지난 프로젝트에서는 구글링을 통해 어찌어찌 thymeleaf, ajax를 이용한 이메일 인증을 했었다 다만 인증 처리 과정도 어설펐고 재사용하기 힘든 코드가 만들어졌다 이번 파트에서 목적은 모던 자바 인 액션..
프로젝트에 도입하기 위해 Jwt에 관하여 구글링 해보면 Login까지의 구현은 여러 블로그에 상세하게 잘 나와있다 그러다 Session 방식이 아닌 Jwt 방식을 사용해 로그아웃은 어떻게 구현 가능할까? 라는 호기심이 생겼고 이에 대해서 찾아보니 Redis를 이용해 해결 하는 방법이 있는 것 같다 로그아웃 요청 흐름을 보면 아래와 같이 이루어진다 1. 로그아웃 요청 2. 레디스에 액세스 토큰 넣음 3. 사용자가 기존 토큰으로 요청 시 JwtFilter에 있는 validate 과정에서 redis로 해당 accessToken 있는지 확인 4. 레디스에 값이 있으면 요청 거부, 없으면 요청 승인 AuthService에 위치한 logout() method SecurityContext를 비우고 accessToke..
[OAuth2] SecurityConfig, OAuth2Config 설정 리팩토링 Spring Security를 이용하다 보면 자동화된 설정이 많아 정말 편리하지만 그럼에도 불구하고 커스텀 설정을 추가해야 하는 경우가 많다 이 글에서는 그중에서 OAuth2 Config에 관해 헤맸던 부분을 다시 ryumodrn.tistory.com 지난 글에서 이어지는 내용으로 리팩토링 후 만난 문제에 관해 남겨보려 한다 새로 작성한 코드로 테스트 해보기 위해 로그인 페이지에서 OAuth2 github 로그인을 시도했는데 스프링 시큐리티가 기본 제공하는 /oauth2/authorization/github 경로로 접근 시 404 에러가 발생했다 또한 가독성을 위해 SecurityConfig에서 OAuth2SecurityC..
Spring Security를 이용하다 보면 자동화된 설정이 많아 정말 편리하지만 그럼에도 불구하고 커스텀 설정을 추가해야 하는 경우가 많다 이 글에서는 그중에서 OAuth2 Config에 관해 헤맸던 부분을 다시 정리해보려 한다 프로젝트가 크지 않다면 모든 보안 설정을 SecurityConfig 하나에 모아두는 선택은 나쁘지 않다 나는 Spring Security 공부를 하며 이것저것 시도해보느라 설정이 많아졌고 자연스레 그 설정에서 사용하는 Custom Bean들도 많아서 SecurityConfig에 다 때려박으면 스크롤이 길어져 가독성이 좋지 못하고 남들이 보기에 깔끔하지 못한 코드가 될 수 있을 것 같아 분리했다 나의 경우엔 아래와 같이 설정을 나눠놨다 최대한 세분화하여 나눴고 MethodSecu..
Spring Security를 사용할 때 권한 체크를 간단히 할 수 있는 방법은 URL 방식과 Method 방식이 있다 Method 방식은 AOP 방식을 기반으로 한다 특히 @EnableGlobalMethodSecurity 설정을 활성화해 아주 간단히 이용할 수 있다 해당 애너테이션을 찾아가 보면 활성화할 수 있는 요소들을 확인할 수 있다 Role만 지정해주는 간단한 사용을 위해서는 securedEnabled = true로 주면 되고 권한 검증에 SpEL을 사용하려면 prePostEnabled = true로 주면 된다 모든 설정은 default false이기 때문에 나는 간단한 방식과 SpEL을 사용하는 방식을 혼용하기 위해 두 설정을 켜줬다 아래와 같이 사용하고자 하는 설정을 켜주고 SecurityCo..
개인 프로젝트에 OAuth2를 적용해봤다 Spring Security를 이용한 로그인, 회원가입 과정을 대체하기 위해서는 아니고 학습 목적이다 학습 목적이라 해보고 싶은 것 다 하려고 google, facebook, github, naver, kakao 다 연결시켰다 SpringBoot 프로젝트에 OAuth2 적용하는 과정은 자세히 설명해준 글을 첨부한다 - 1편 Spring Boot OAuth2 Social Login with Google, Facebook, and Github - Part 1 In this article, You'll learn how to add social as well as email and password based login to your spring boot applicat..