현재 JSESSIONID로 로그인된 회원 인가 작업을 진행한다.JSESSIONID는 Spring Server로부터 Set-Cookie로 받아오는데, 이 때 JSESSION 쿠키의 만료 시간은 Session과 동일하다.즉, 브라우저를 종료하거나 로그아웃 하게 되면 만료되는 것이다. 한편, jwt토큰을 이용하면 흔히 AccessToken과 함께 RefreshToken을 이용하여 보안을 강화하고, 로그인 시간을 충분히 확보한다.JSESSIONID로 로그인을 하게되니, jwt토큰의 RefreshToken과 같은 역할이 필요했다. Remember-meSpring Security는 Remember-me라는 기능을 제공하는데, 이는 Session의 짧은 만료 기간을 보완해준다.사용자가 로그인을 성공하면, 기존의 JS..
전체 글
필터 요청 - 중복 가능 클라이언트가 다음과 같이 요청을 한다. http://localhost:8080/api/list?departmentFilter=A&departmentFilter=B&genderFilter=M&order=AGE 쿼리스트링을 살펴보면, departmentFilter 2개, genderFilter 1개, order 1개이다. 쿼리스트링의 모든 값 중에서 하나라도 해당하면 조회가 가능하도록 설계해보자. 먼저, Controller에서 요청 받는 부분이다. Controller.java @GetMapping("/list") public ResponseEntity personnelList( @RequestParam(value = "departmentFilter", required = false)..
현재 진행중인 서비스는 최소 100개 이상의 이미지 파일이 기본적으로 사용되고, 추후에 각 게시글 이미지가 추가될 것을 고려하여 로컬에 이미지를 저장하기로 했다. (평소 프로젝트에서 이미지를 관리했던 S3를 사용하기에는 용량의 제한(프리티어 5GB)이 있어 사용하지 않음) 로컬 이미지 접근 Client(React)에서 Spring으로 이미지 파일 전송 → Spring에서 로컬에 파일 저장/데이터베이스에 파일 경로 저장 react에서 로컬 파일에 접근할 수 없음 Client가 로컬에 저장된 파일을 Spring 서버 주소를 통해 접근 WebConfig.java @Configuration public class WebConfig implements WebMvcConfigurer { private String ..
Docker로 React, Spring 애플리케이션을 인스턴스에 배포하는 과정에서의 고민을 기록하고자 한다. amazon linux vs ubuntu 아마존 리눅스는 centos기반 패키지를 더 얹은 os이다 서버용으로 보통 실무에서는 ubuntu보다 centos를 사용하고, AWS를 이용하는 현 상황에서 amazon linux를 사용 docker jre image slim vs alpine 둘 다 용량을 최소화하도록 설계되었음 slim은 debian linux 기반으로 애플리케이션을 실행하는 데 필요한 패키지만 포함한다. alpine은 alpine linux 기반으로 slim 이미지에 포함된 패키지 중 일부가 포함되어 있지 않지만 가장 가볍고, 보안에 더 강하다는 특징이 있다. 본 서비스에서는 용량의 ..
운영중인 서비스 서버에 장애가 발생했을 때 email로 요청을 받아 신속하게 처리할 수 있는 환경을 만들고자 Grafana의 Alert로 알림 기능을 구성하였습니다. 구글 보안 설정 grafana 서버로부터 이메일(Alert)을 받으려면 보안 수준이 낮은 앱 엑세스를 허용해 주어야 합니다. 하지만 2022.05.30부로 구글에서 더 이상 사용자 이름과 비밀번호만 사용하여 로그인하도록 요청하는 서드 파티 앱 또는 기기의 사용을 지원하지 않아 보안 수준이 낮은 앱 엑세스를 허용해주지 못합니다. 위 내용을 해결하려면, 구글 계정 2단계 인증 후 앱 비밀번호를 생성해주면 됩니다. 2단계 인증 앱 비밀번호 생성 이제 생성된 16자리의 앱 비밀번호로 grafana 서버에서 해당 계정에 메일을 보낼 수 있는 것입니다..
현재 진행 중인 프로젝트에서는 이미지를 S3에 업로드하고, Endpoint URL로 이미지를 불러온다. 하지만 이렇게 S3만으로 이미지를 관리하면서 서비스를 운영하기에는 본인의 S3가 사용자에게 그대로 노출되어진다. 사용자로부터 직접적인 접근을 제한하고, Edge Location에 캐싱 및 지리적인 이점을 통한 성능 이점(전송 속도, 비용 절감, 서버 부하)을 제공하는 CloudFront를 본 프로젝트에 적용한 과정을 소개하고자 한다. CloudFront CloudFront는 AWS에서 제공하는 CDN 서비스이다. 전 세계 이곳저곳에 Edge Server(Location)을 두고 Client에 가장 가까운 Edge Server를 찾아 Latency를 최소화시켜 빠른 데이터를 제공하고, 캐싱을 통해 사용자..
MSA 서비스의 각 application.yml 설정 값을 Spring Cloud Config 서버에서 요청 받아 오는 방식으로 구성하는 도중 보안 관련 문제점이 있었고, 이를 해결한 방법을 소개하고자 한다. 문제 상황 Config 서버의 URL을 직접 주소창에 입력하여 요청하면, 복호화 된 설정 값이 그대로 노출 된다는 문제점이 있다. config 서버에 다음과 같은 요청을 보내면 모든 설정 값을 볼 수 있다. http://publicIP:8888/member/prod Config 서버에서 요청 받는 설정 값은 DB Password, AWS secret key와 같은 민감 정보가 들어있기 때문에 url 요청에 의한 조회를 방지해야 한다. AWS VPC AWS VPC는 aws 사용자의 전용 가상 네트워크..
서비스에 대한 테스트를 진행할 때 Redis 서버가 실행 중이지 않아 테스트 시 Redis 서버를 구동시켜야 하는 불편함이 있다. 테스트 환경에 대한 내장 Redis를 구축하여 원활한 테스트를 진행하고자 한다. Build.gradle implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '2.4.10' implementation group: 'it.ozimov', name: 'embedded-redis', version: '0.7.3' EmbeddedRedisConfig.java import java.io.IOException; import lombok.extern.slf4j.Slf..
Spring Config 서버를 구축하여 여러 서버에서 활용되는 공통된 설정값을 관리할 수 있다. 공통된 설정 파일들은 로컬 파일 시스템, 로컬 git 레포지토리 또는 remote git 레포지토리에 올려서 관리 할 수 있음 https://docs.spring.io/spring-cloud-config/docs/current/reference/html/ 현재 진행 중인 프로젝트에서는 remote git private 레포지토리에 설정파일을 올려 관리하고 있다. 민감 정보에 대한 보안을 위해 private 레포지토리로 구성하였고, 대칭키를 이용하여 설정값을 암호화 Refresh 설정 파일이 외부에서 관리되기 때문에 서버가 실행되고 있는 도중 설정 값이 변경될 수 있다. 하지만 설정 파일이 변경되어도 설정 클..
Spring Cloud Gateway는 @ControllerAdvice를 지원하지 않아 ErrorWebExceptionHandler를 구현해야한다. ErrorExceptionConfig.java@Configuration@RequiredArgsConstructorpublic class ErrorExceptionConfig { private final ObjectMapper objectMapper; @Bean public ErrorWebExceptionHandler globalExceptionHandler(){ return new GlobalExceptionHandler(objectMapper); }}ErrorWebExceptionHandler를 bean으로 등록하면 에러핸..