저번 포스팅에 이어서 Spring Security와 Jwt을 사용하여 회원 인증/인가 시스템을 만들어 보겠다. Spring Security를 사용하게 되면 전달받은 JWT를 Filter를 통해 Authorization(인가), Authentication(인증) 을 처리하게 된다. 이를 위해서 User 정보를 Jwt의 Payload에 Claim들을 넣고, 꺼내서 처리할 수 있는 시스템을 만들면 된다. 우리가 갖고 있는 User를 그대로 클레임으로 넣고 꺼내서 처리하기에는 모든 User 모델이 제각각일테니 이를 처리하기 위한 공통의 인터페이스가 존재한다. UserDetails Interface이며 이를 implements한 User 객체를 새로 만들어서 사용하면 된다. Member implements Use..
스프링 부트로 프로젝트를 진행할 때 필요한 기술들이 많아지면서 기본 틀을 잡는데도 많은 공수가 들어가며 환경설정에 너무 많은 시간이 들게 되었다. 이에 미리 프로젝트를 위한 구조를 만들고 실행 가능한 이미지를 만들어서 도커에 올려 놓으려고 한다. 진행할 목차에 대해 간단히 정리하면 필요 라이브러리 설치 Spring Data JPA, Spring Data Envars, QueryDSL 적용 API 사용 및 테스트를 위한 기본 설정 REST API / GraphQL (DGS) JWT 사용을 위한 기본 설정 로그인 / 로그아웃 구현 FLYWAY를 통한 기본 테이블 생성 및 데이터 삽입 Redis를 이용한 캐시 AOP 적용 도커 이미지 생성 후 업로드 위와 같은 순서로 적용해보고자 한다. 사용 기술 언어 / 프..
현재 Flow 정리 JwtAuthenticationFilter 클래스 Login 요청이 오면 JwtAuthenticationFilter에서 attemptAuthentication()를 호출하여 인증을 처리한다. Username&Password가 정상이면 -> AuthenticationToken을 발급한다. 인증토큰 객체를 이용해서 UserDetailsService의 loadUserByUsername()을 호출하여 회원 존재 여부를 검증 한다. UserDetails 객체로 반환된 객체에 대해서 PasswordEncoder를 통해 패스워드를 검증한다. 제대로 검증이 됐다면 인증토큰 객체를 반환하여 시큐리티_세션에 저장한다. 검증 결과에 따라 successfulAuthentication() 또는 unsucc..
Username, Password를 이용한 검증은 완료된 상태로 다음 수행될 successfulAuthenticaiton() 메서드에서 JWT토큰을 발급해보도록 하겠다. JwtAuthenticaitnoFilter 클래스 @Slf4j @RequiredArgsConstructor public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final AuthenticationManager authenticationManager; // login 요청을 하면 로그인 시도를 위해서 실행되는 함수 @Override public Authentication attemptAuthentication(HttpServle..
이전 포스팅에서 정리한 내용을 기반으로 로직을 작성해겠다. 회원 로그인을 검증하기 위한 UsernamePasswordAuthenticationFilter를 상속받아 로그인 검증을 하고 토큰을 발급받는 JwtAthenticationFilter 클래스를 구현해본다. 로그인 검증 로직 로그인 요청 (username, password) UsernamePasswordAuthenticationFilter에서 [username, password]를 이용해서 정상적인 로그인 여부를 검증 DI로 받은 AuthenticationManager 객체를 통해 로그인을 시도한다. UserDetailsService를 상속받은 PrincipalDetailsService 클래스가 호출되고 loadUserByUsername() 메소드가..
UserDetails, UserDetailsService를 왜 사용해야하는 것일까? 먼저 스프링 시큐리티의 동작을 이해해보자. 시큐리티는 "~/login" 주소로 요청이 오면 가로채서 로그인을 진행한다. 로그인 진행이 완료되면 시큐리티_session을 만들고 SecurityContextHolder에 저장한다. ( SecurityContextHolder = 시큐리티 인메모리 세션 저장소 ) 시큐리티가 갖고있는 시큐리티_session에 들어갈 수 있는 Object는 정해져있다. ( Object == Athentication 타입 객체 ) Authentication 안에 User 정보가 있어야 한다. User 객체 타입은 UserDetails 타입 객체 이다. 정리해보면 Security Session에 객체를..
Filter 필터는 외부 요청을 가장 먼저 검증하는 곳이다. 커스텀 필터를 만들어서 테스트해보자. Filter 생성 @Slf4j public class MyFilter1 implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { log.info("Filter 1"); chain.doFilter(request, response); } } Filter 인터페이스를 상속받아서 구현해주면 된다. 이때 메소드는 init(), destroy(), doFilter()가 있다. Parameter로..
JWT에 대한 기초 지식은 아래 포스팅을 통해 먼저 알아보고 오자 Json Web Token 정리 JWT 사용이유 JWT 이제 jwt를 왜 사용해야하는지는 충분히 알았을 거라 생각하고 어떤 매커니즘으로 jwt를 이용해서 로그인을 구현하고 인증과 인가를 처리하는지 알아보도록 하자. 우리가 가장 먼저 해야할 부분은 JWT를 사용하기 위해 의존성을 추가하는 것이다. 스프링 시큐리티과 JWT를 이용하여 인증/인가를 구현할 것이므로 관련 의존성을 추가해준다. implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'com.auth0:java-jwt:3.19.2' Spring Security Configuration ..
마무리 이렇게 나의 서비스에 속한 판매자들이 자신의 상점을 등록하기 위한 서브몰 등록/수정/삭제/조회 API 개발을 모두 완료하였다. 중간에 공식문서의 문제로 인한 우여곡절도 있었지만 최종적으로 필요한 API는 모두 개발을 완료하였다. 물론 추후 정산 관련 API도 개발해야 되지만 이 부분은 차후 MVP모델에서 실제 비지니스 모델로 발전시킬 때 필요한 부분이라 나중에 개발할 예정이다. 결제 시스템을 개발하기 위해 외부 PG 업체의 API를 뜯어보면서 나의 서비스와 연결하는 과정이 순탄치는 않았지만 에러 처리나 안정적인 요청을 위한 로직 설계등을 하면서 많은 부분들을 배울 수 있어서 좋았다. 토스페이먼츠에 최종적으로 서비스 계약을 위해 신청까지 넣었는데 카드사 결제 까지 승인이 나기위해서는 영업일 기준 최..
토스페이먼츠 서브몰 관련 문제를 해결하여 등록은 완성되었으니 추가적으로 조회, 수정, 삭제까지 구현해보겠다. 서브몰 조회 Controller Submall 조회 @GetMapping @ApiOperation(value = "서브몰 조회", notes = "판매자의 서브몰을 조회합니다.") public SingleResult registSubmall( @ApiParam(value = "코디네이터 이메일", required = true) @RequestParam String crdiEmail ) { try { return responseService.getSingleResult( submallService.getSubmall(crdiEmail) ); } catch (Exception e) { e.printS..
지급대행 앞에서 우리 서비스에 등록된 판매자들이 정산받기 위해 등록하는 계좌에 대한 검증을 금융결제원의 계좌실명조회 API를 통해 하려고 했었다. 하지만 이는 일반적인 가맹점에서는 불가능하고 토스페이먼츠에서 제공하는 API를 통해서 서브몰들을 등록/조회/정산 등을 할 수 있다. 따라서 기존 금융결제원 방식의 계좌번호 실명조회 기능을 버리고 토스페이먼츠에서 제공하는 지급대행 API를 통해서 서브몰을 등록하고 조회 후 정산 관련 업무를 위한 기능까지 만들어보겠다. 서브몰 구조 & 등록 구현 우리 서비스를 이용하는 판매자는 우선적으로 자신의 은행, 계좌번호 등을 등록하여 서브몰을 등록해줘야 한다. 이때 서브몰의 고유한 아이디, 상호명, 대표명, 사업자 등록번호, 개인/법인 등이 필요하고 정산을 받기 위한 은행..
가상결제를 완료했으니 취소까지 이어서 해보겠다. 이 부분은 이전 카드 결제취소 부분과 매우 흡사다. 다만 계좌이체로 금액을 지불하였으므로 환불도 환불계좌로 돌려주는 방식으로 해줘야 한다는 점이다. 따라서 결제 취소 때 cancelReason 외에도 cancelAmount와 환불입금계좌 정보를 입력해서 요청해줘야 한다. 토스페이먼츠에서 명시하고 있는 환불 요청 양식을 봐보자. 토스페이먼츠 환불요청 HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.tosspayments.com/v1/payments/{_페이먼트키_}/cancel")) .header("Authorization", "Basic _클라이언트_키") .header..
- Total
- Today
- Yesterday