본문 바로가기

Proj

(26)
로그인 인증 과정 추가해보기 - AuthenticationProvider 커스텀 1. 개요해당 프로젝트에서는 관리자 계정으로만 Username password 방식으로 로그인이 가능해야 한다. 이전 포스팅에서의 동작을 기반으로 해당 인증과정을 추가해보고자 한다.2. AuthenticationProvider지난 포스팅에서 언급했듯이 인증 자체는 AuthenticationProvider에서 진행되고, 그 결과를 AuthenticationManager가 받는다. 인증 과정을 추가하려면 AuthenticationProvider를 수정하면 될 것이다. protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws Aut..
application/json 형식으로 관리자 로그인 구현하기 1. 개요해당 프로젝트에서 관리자 페이지를 만들어 운영하기로 했다. 운영하게 될 서비스는 소셜 로그인만 지원하도록 했지만 관리자 페이지는 username/password 형식으로 구현하도록 할 것이다. 해당 프로젝트는 스프링 시큐리티를 사용하므로 필터를 사용하여 로그인을 구현하고자 한다.2. 사용한 코드2-1. LoginFilterpublic class JsonUsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter { private static final String DEFAULT_LOGIN_REQUEST_URL = "/api/v1/login/admin"; // /login 으로 오는 요청을 처리할 것이..
스프링부트 테스트코드 작성하기: Controller 1. 개요이전 포스팅에서 repository, service 계층의 단위 테스트를 작성해보았다. 이번에는 controller 계층의 단위테스트를 작성해보고자 한다.2. Controller@WebMvcTest(MemberController.class)@MockBean(JpaMetamodelMappingContext.class) //JPA 관련 빈들을 mock으로 등록class MemberControllerTest { @Autowired MockMvc mockMvc; @MockBean MemberService memberService; @Autowired ObjectMapper objectMapper; @Test @DisplayName("회원 활성화 완료 응..
스프링부트 테스트 코드 작성하기: Repository, Service 1. 개요지금까지 회원 관련 MVP를 구현해보았다. 해당 게시글에서는 현재까지 구현한 기능 중 회원 기능에 대한 테스트코드를 작성해보고자 한다. Repository의 테스트코드가 짧으므로 서비스 계층과 묶었다.2. Repository 계층 테스트@EnableJpaAuditing@TestConfiguration@EnableJpaRepositories(basePackages = "com.junior")//@EntityScan(basePackages = "com.junior.dto")public class TestConfig { @PersistenceContext private EntityManager entityManager; @Bean public JPAQueryFactory jpaQ..
스프링 시큐리티에서 발생하는 예외 처리하기 1. 개요해당 프로젝트에서는 ApiExceptionHandler 클래스를 가지고 예외를 처리한다. 해당 클래스에는 @RestControllerAdvice가 있는데 스프링 시큐리티 필터에서 발생하는 오류는 대상이 아니기 때문에 커스텀 예외를 응답으로 보내지 못했다. 이를 해결해보고자 한다.2. 필터 추가해당 프로젝트는 JWT 방식을 사용하여 인증 및 인가를 처리한다. 만약 유효하지 않은 JWT가 들어오게 된다면 이를 처리할 필요가 있다.@Slf4j@RequiredArgsConstructorpublic class JwtValidExceptionHandlerFilter extends OncePerRequestFilter { private final JwtUtil jwtUtil; protected v..
Trouble Shooting: @Value에 값이 불러와지지 않는 문제 1. 개요카카오 로그인을 구현하다 발생한 문제이다. 프론트 측에서 코드를 받아 서버에 보내면, 서버에서 이를 Auth 서버와 Resource 서버를 통해 사용자 정보를 받아오고, 로그인을 진행하는 과정을 거치게 된다. 이렇게 개발하여 배포했을 때 카카오 측에서 401 에러를 발생시켰다. 그 원인과 해결책을 알아보고자 한다.2. 원인?로깅 레벨을 debug로 보고 관련 로그를 확인해보았다. 진행 로직에서 다음의 URL로 Auth Server에 요청을 보내는 것을 확인할 수 있었다.https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id&code=인증 코드&client_secret이걸 보고 client_id와 secret key가..
Spring OAuth2를 사용하여 소셜 로그인 구현하기 (feat.추가 정보 입력) 1. 개요Tripot 프로젝트에서는 소셜 로그인만을 사용하여 회원의 정보를 받고자 한다. 이에 따른 구현 과정을 작성한다.2. 개발 과정2-1 추가 정보 입력 로직해당 로직을 어떻게 구현해야 하는지 떠올리는 데 생각보다 오래 걸렸다. 만약 어떤 회원이 추가정보 입력 화면에서 앱을 종료해버릴 경우 이를 확인할 방법이 없기 때문이다. 그러다 프론트 분과 대화해 본 결과 응답 바디 값에 따라 서로 다른 페이지로 이동하는 것이 가능하다고 했다. 이에 따라 다음과 같이 로직을 작성했다. 이후 개발을 하다보니 소셜 로그인 진행중에 회원 가입 처리가 되어야 한다는 것을 알고 이를 조금씩 다듬었다.2-2 로그인 진행 과정: 설정우선 카카오 로그인에 관련된 주소 및 정보를 yml 파일에 저장한다. security: ..
프로젝트 DB 보안 간단히나마 관리하기 1. 개요Tripot 프로젝트를 진행하던 중 스프링부트 프로젝트와 DB가 연결되지 않는 문제가 발생했다. DB 상태를 확인하니 다음의 결과가 나왔다.systemctl status mysql mysql이 죽어버린 것이다. 이 글에서는 이의 원인을 찾고 해결하는 과정을 작성한다.2. 원인이와 관련하여 구글링해본 결과 처음에는 외부에서 접속을 많이 시도하여 발생한 문제인 케이스가 많았다. 이에 따라 에러 로그를 확인해봤다. mysql의 에러 로그는 다음의 경로에 위치한다./var/log/mysql/error.log 하지만 프로젝트에서 사용하는 PC는 어떤 로그도 찍히지 않았고, 다른 원인이라고 생각하여 찾아보던 중 mysql에 RECOVER_YOUR_DATA라는 DB가 있어 들어가 찍어보았다. 옛날에 컴퓨터 ..