백엔드 36

google otp fast api 서버 적용

이번 포스팅에서는 사용자 인증 보안을 강화하기 위해 google otp 를 적용하는 과정을 포스팅하려고 합니다.먼저 google otp의 동작과정을 바탕으로 비동기, 동기 처리를 해야하는지를 판단하는 과정을 기록하고, 이후 fast api에 google otp를 적용하는 과정을 설명하려고 합니다.  1. google otp의 동작과정 1) Set Up- server에서 otp 시크릿 키를 생성하고 google Authenticator 에 QR 코드를 생성합니다. 2) OTP Generation - user는 QR 코드를 바탕으로 키를 인증합니다. 이 과정은 서버가 아닌 다른 네트워크(다른 api 등)를 거치지 않고 local 적으로 동작합니다. 3) OTP Verification - user가 키를 인증..

백엔드 2024.04.05

jwt refresh token 을 Redis로 리팩토링하기

기존에 db 테이블에 저장하여 조회하던 refresh Token을 Redis 인메모리 데이터 구조 저장소로 리팩토링하는 과정을 기록하는 포스팅입니다. 기존의 코드는 아래와 같습니다. 1. requestBody에 담긴 accessToken을 바탕으로 DB에서 refreshToken을 체크합니다 2. 만약 refreshToken이 valid하다면 accessToken을 발급합니다. DB에서 Redis로 리팩토링 하는 이유 1. refreshToken은 만료기간이 있는 token인데 DB에 저장할 필요가 있는지에 대한 의문이 들었습니다. -> DB는 또한 디스크의 읽기 쓰기와 관련되므로 api 응답속도도 느립니다. -> 인메모리를 사용하는 것으로 리팩토링하기 DB에서 Redis로 리팩토링 하는 과정 1. me..

백엔드/Spring 2024.03.04

외장 톰켓에서 서버 실행해보기

이번 포스팅에서는 외장 톰켓에서 서버를 실행해본 과정에 대해 포스팅하려 합니다. 1. gradle 파일이 있는 곳으로 terminal 경로 설정하기 2. war 파일 생성하기 이후 build/libs에 war 파일이 생성되어 있음을 알 수 있습니다. WAR 파일은 Web Application Archive의 약자로 WAS에 배포할 때 사용하는 파일입니다. JAR 파일이 JVM 위에서 실행된다면, WAR 파일은 웹 어플리케이션 서버 WAS 위에서 실행됩니다. 3. apache-tomcat의 webapps에 war 파일을 넣습니다. 이 때 이름은 ROOT로 해야합니다. 4. apache-tomcat의 bin 폴더로 들어가 terminal에서 startup.bat(window 전용 명령어)를 실행해줍니다. S..

백엔드 2024.01.10

Service 계층 단위 테스트를 위한 Mockito 사용하기

기존에 @SpringbootTest 어노테이션를 사용하여 Service 계층을 테스트하였습니다. 그러나 실제 DB와 관련된 Repository 계층 등을 직접 주입받아야 했고, 이렇게 된다면 service 계층만의 단위 테스트를 제대로 하지 못할 것이라는 판단을 하였습니다. 따라서 Mockito를 사용하여 리팩토링하였는데, 이 과정을 포스팅하려 합니다. Service 계층 단위 테스트 - 기존의 코드 @SpringBootTest @Transactional(readOnly = true) @ExtendWith(MockitoExtension.class) class TicketInformationServiceTest { @Autowired private TicketInformationRepository tick..

백엔드/Spring 2023.10.17

[Spring] 서블릿과 스프링 MVC 패턴

이번 포스팅에서는 Spring에서 사용하는 서블릿이 무엇인가, 그리고 이와 관련하여 Spring은 어떤 동작을 하는지에 대해서 정리하려고 합니다. 서블릿 1. 서블릿의 개념 서블릿은 request, response을 통해 동작하는 프로그래밍 모델에서 웹 서버의 역할을 **확장**할 수 있도록 하는 자바 클래스입니다. 서블릿은 request를 받고 동적인 웹 페이지를 만들어 client에 응답합니다. *확장의 의미 정적인 리소스를 응답하는 웹 서버에 동적인 웹 페이지 응답을 전달하는 WAS의 역할을 하는 것입니다. WAS = 웹 서버 + 서블릿 Container 2. 서블릿의 동작 과정 순서 WAS의 서블릿 컨테이너가 Servlet 객체를 생성 Client가 해당 Servlet을 사용하는 http 요청을 ..

백엔드/Spring 2023.07.14

jwt + spring security 동작 과정 간단 정리

이번 포스팅에서는 spring security를 활용하여 jwt를 구현하였는데, 이 과정에 대해 공부한 내용을 정리해보려고 합니다. 1. SecurityFilterChain의 addFilterBefore addFilterBefore() 메소드는 특정 필터를 등록하는 역할을 하며, 첫 번째 인자로 등록 필터를 전달하고, 두 번째 인자로 등록할 위치를 전달합니다. UsernamePasswordAuthenticationFilter는 Spring Security에서 기본적으로 제공하는 폼 인증 처리 필터입니다. 이를 기준으로 JwtAuthenticationFilter가 등록되므로써, 사용자 인증 전 JWT 토큰을 검사하게 되는 것입니다. Q) UsernamePasswordAuthenticationFilter 와..

백엔드 2023.05.14

[백엔드] jwt vs session

이번 포스팅에서는 인증 방식인 jwt와 session을 비교하고, 각각의 특징을 정리해보려고 합니다. 현재 프로젝트에서 회원 관리 API를 설계하려고 하는데 그 전에 회원을 인증하는 방식을 jwt 와 session 중 어떤 것을 활용해 구현할지를 고민하고 있습니다. 이에 jwt와 session 방식을 비교해 선택하기로 결정하였고, 이 과정을 포스팅하려고 합니다. Session 1. Session이 필요한 이유 HTTP 프로토콜은 비상태성(Stateless)와 비연결성(Connetionless) 특징을 가지고 있습니다. 서버간의 연결을 유지하지 않음으로써 서버의 리소스를 효율적으로 사용하고, 클라이언트의 상태를 유지하지 않음으로써 서버의 부하를 줄이기 위함입니다. 하지만 이런 특징들은 상태를 유지해야 하는..

백엔드 2023.04.13

[Spring] 디렉터리 패키지 구조 구성하는 방법

스프링으로 프로젝트를 시작하려고 하는데, 어떻게 패키지의 계층 구조를 나눠야 효율적인지 궁금해졌습니다. 그래서 어떤 방법이 좋을지를 찾아보았는데, 이와 관련해 내용을 정리하려고 합니다. 계층형 디렉토리 패키지 구조 계층형 디렉토리 패키지 구조는 아래와 같이 3가지로 구분됩니다. 1. Web Layer: 사용자의 요청과 이에 대한 응답을 반환하는 처리가 일어나는 Layer 2. Service Layer: 실제 비지니스 로직이 일어나는 Layer로 Web Layer와 Repository Layer 사이에 있는 Layer 3. Repository Layer: DB와 통신하는 Layer 계층형 구조의 장점 1, 전체적인 프로젝트의 구조를 빠르게 파악할 수 있습니다. 계층형 구조의 단점 1. 각각 패키지 디렉토리..

백엔드/Spring 2023.03.13

[JPA] N+1 문제를 해결하기 위한 fetch

오늘 포스팅에서는 fetch = Lazy에서 발생할 수 있는 N+1 문제를 해결하기 위해 등장한 fetch join의 장점과 한계를 정리해보는 시간을 가지겠습니다. 1. JPA에서 N+1 문제의 발생 코드 Team teamA = new Team(); teamA.setName("teamA"); em.persist(teamA); Team teamB = new Team(); teamB.setName("teamB"); em.persist(teamB); Member member1 = new Member(); member1.setUsername("member1"); member1.changeTeam(teamA); em.persist(member1); Member member2 = new Member(); membe..

백엔드/JPA 2023.03.06

[AWS] EC2, CloudFront, Route53 연결하기

오늘은 EC2와 Route53을 연결한 뒤 과정으로 CloudFront를 통해 CDN 설정을 하는 법을 정리하겠습니다. 보통 웹사이트를 배포하면 용량이 큰 resources 때문에 페이지 로딩이 느린데, 보통 이러한 문제를 CDN을 통해 해결합니다. AWS에서는 CDN을 활용할 수 있도록 CloudFront를 제공합니다. 1. CloudFront 생성하기 2. EC2 주소 입력하기 원본 도메인에 EC2의 public 주소를 입력합니다. 참고로 이 부분에는 탄력적 IP의 고정 주소값을 입력할 수 없습니다. 3. 대체 도메인을 입력하기 대체 도메인을 입력하기 위해서는 반드시 SSL 인증서가 필요합니다. 4. 인증서 요청하기 인증서 유형은 퍼블릭 인증서 요청으로 하고, 도메인 이름은 기존에 받은 도메인으로 입..

백엔드/AWS 2022.12.04