본문 바로가기

전체 글139

method return에 대한 고민 method 를 만들 때 정상적인 flow 가 아닌 상황을 고려하다보면 null, Optional, exception 3가지를 활용하게 된다. rsa 키를 달라는 요청을 받을 때, 미리 만들어둔 키를 캐시에서 가져오고 캐시에 없으면 새롭게 만드는 로직을 예제로 살펴보자. public RsaKeyData getRsaKeyData() { RsaKeyData rsaKeyData = getCacheData(); if (rsaKeyData == null) { return generateRsaKeyData(); } return rsaKeyData; } 위 코드에서 이 메서드가 null 을 리턴하면 새롭게 rsa 키를 만들도록 되어있다. 그런데 getCacheData 메서드 결과가 null 이라는건 무슨뜻일까? 1... 2021. 2. 7.
Cookie SameSite 기본편 쿠키는 stateless(상태 정보를 유지하지 않는) HTTP protocol 에서 stateful 하게 사용할 수 있게 해주는 수단이다. 먼저 쿠키의 기본 성질에 대해서 알아보자. 1. 서버에서 응답 헤더로 아래와 같은 Set-Cookie 헤더를 보내주면 이후 요청마다 브라우저가 헤더에 쿠키 정보를 같이 전송해준다. 2. admin.ybs.com 도메인으로 쿠키를 만들었을 때, 브라우저는 하위 도메인 요청에도 쿠키를 같이 전달한다. SameSite SameSite 탄생 배경 Set-Cookie: ybs=1234; Path=/; Domain= admin.ybs.com; SameSite=Strict 위와 같이 쿠키에 SameSite 속성이 새롭게 추가 되었다. 사실 새롭다고 하기는 뭐한게 2016년에 dr.. 2021. 2. 5.
https + id/pw rsa 암호화 로그인 페이지를 재개발 하면서 전체적인 흐름을 정확히 알 필요가 생겼다. https 를 이용해 요청/응답 데이터가 암호화되는데, id/pw 입력 데이터를 한번 더 암호화 하면서 복잡도가 증가했기 때문이다. https 통신 먼저 기본적인 https 메커니즘부터 살펴보자. 처음에 YBS 서버가 CSR 파일을 만들어서 CA 인증기관 에 요청해야 한다. 인증서 등록 작업(구매)이다. CSR 파일을 생성할 때 YBS 비밀키, YBS 공개키를 만들게 되고 YBS 서버 인증서를 위한 정보를 입력해 파일을 만든다. $ openssl genrsa -rand rand.dat -des3 2048 > ybs.key.pem $ openssl req -new -key ybs.key.pem > ybs.csr.pem // 이후 cs.. 2021. 1. 31.
Spring Cloud Gateway CORS 주의사항 CORS 요청을 받기 위해 서버가 해줘야 하는 작업들이 있다. 그런데 Spring Cloud Gateway 는 프록시 서버이기 때문에 조금 더 신경써야 하는 부분이 있어 정리했다. ※ CORS 기본 개념까지 같이 설명하기엔 글이 너무 길어져서 안다는 전제로 작성했다. 먼저 Spring Cloud Gateway 는 CORS 요청을 디폴트로 막는다. CORS 허용하는 방법 1) CorsWebFilter 첫번째 방법은 CorsWebFilter 를 이용하는 것인데, 헷갈리지 말아야 될 게 있다. CorsWebFilter 는 Spring Cloud Gateway 에서 제공하는 필터가 아니다. org.springframework.web.cors.reactive 에서 제공하는 필터다. 그래서 Spring Cloud .. 2021. 1. 24.
오버로딩vs오버라이딩(면접단골질문) 뻔한 질문이지만 한걸음 더 들어가서 보면 배열과 제네릭까지 묶어서 같이 이야기를 풀어나갈 수 있다. 예제 코드 및 설명은 이펙티브 자바를 많이 참고했다. 먼저 아래의 코드를 살펴보자. 이 코드의 목적은 컬렉션을 종류별로(집합이냐, 리스트냐, 아니면 다른 종류의 컬렉션이냐) 분류하는 것이다. // 의도한 결과를 내지 않는 분류기 public class CollectionClassifier { public static String classify(Set s) { return "Set"; } public static String classify(List lst) { return "List"; } public static String classify(Collection lst) { return "Unknown .. 2021. 1. 22.
useInsecureTrustManager 옵션 Spring Cloud Gateway 에서 useInsecureTrustManager 옵션 디폴트는 false 다. Spring Cloud Gateway 가이드는 보안 이유로 true로 설정하는건 production 에 적합하지 않다고 한다. cloud.spring.io/spring-cloud-gateway/multi/multi__tls_ssl.html 7. TLS / SSL The Gateway can listen for requests on https by following the usual Spring server configuration. Example: Gateway routes can be routed to both http and https backends. If routing to a ht.. 2021. 1. 20.
단순회귀분석 (1편) 이 내용은 회귀분석 3판(박성현 저) 책을 보고 정리했다. 변수들간의 함수관계를 추구하는 통계적 방법을 회귀분석이라고 부른다. 회귀라는 말은 영국의 우생학자 F.Galton 이 처음으로 불렀다고 한다. 그는 아버지의 신장(키)과 아들의 신장의 관계를 조사했다. 그리고 아들들의 신장은 인간 전체의 평균 신장에 되돌아가려는 경향이 있다는걸 밝혔다. 이러한 함수관계를 'regression' 이라는 용어로 처음 표현한 사람이 F.Galton 이고 유래가 되었다. 먼저 제일 간단한 경우에 해당하는 선형관계에 관한 분석을 다뤄보자. 광고가 상품 판매량에 미치는 관계를 알아보기 위해 10개의 상점 표본(sample)을 추출하여 아래와 같이 표로 정리했다. 상점번호 광고료 (단위: 10만원) 총판매액 (단위: 100만.. 2021. 1. 20.
request body memory leak 평화롭던 서버에서 갑자기 reactor-netty out of direct memory error 다수 발생했다. 따로 설정을 한게 없어서 direct memory max 가 1G 인데 초과된것이다. ERROR default c.n.s.p.GlobalErrorWebExceptionHandler - [GlobalErrorWebExceptionHandler] ETC reactor.netty.ReactorNetty$InternalNettyException: io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 16777216 byte(s) of direct memory (used: 1056964615, max: 1073741824) Suppres.. 2021. 1. 20.
reset_timedout_connection 옵션 서버 모니터링을 수행하는데 Active Thread 가 끝없이 증가한적이 있었다. nginx 는 아래와 같이 upstream 을 이용해 proxied server와 keepalive 로 연결해놓고 사용중이었다. upstream ybs-server { server localhost:8080; # upstream 서버와 유지할 connection의 갯수를 keepalive로 설정한다. keepalive 200; } 그런데 nginx keepalive_timeout 설정을 했음에도 불구하고 접속이 계속 유지되고 끊기지 않았다. $ netstat -an | grep 8080 tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:8080 127.0.0.1:43585 .. 2021. 1. 19.
timeout 설정 정리 nginx 는 reverse proxy로 많이 사용되는 만큼 다양한 timeout 설정이 있다. 각각을 좀 정확히 알고 싶어서 정리했다. client_header_timeout request header 정보를 읽는데 설정된 timeout 시간이다. client_header_timeout에 지정한 시간안에 client가 헤더를 전송하지 않으면 요청은 408(Request Time-out)로 끝난다. 디폴트 값은 60초이다. client_header_timeout 60s; client_body_timeout request body 정보를 읽는데 설정된 timeout 시간이다. request body 전체 전송 timeout 시간이 아니라, 두개의 연속적인 읽기 작업 사이의 timeout 시간이다. clie.. 2021. 1. 19.
파일 업로드/다운로드 시 임시 디렉토리 권한 이슈 client_body_buffer_size 는 client 요청 바디를 읽기 위한 버퍼 크기다. 디폴트 값은 8K (32 bits) | 16K (64 bits) 다. 요청 바디 크기가 버퍼 크기보다 크면, 전체 또는 일부가 http-client-body-temp-path 에 해당하는 디렉토리에 쓰여진다. http-client-body-temp-path 는 최초 nginx 설치 할 때 --http-client-body-temp-path=path 지시자로 정한다. 디폴트 값은 prefix/proxy_temp 이고(prefix는 Nginx 빌드 결과물이 들어갈 디렉토리), 경로는 nginx.conf 에서 client_body_temp_path 지시자로 바꿀 수 있다. 이때 nginx 실행 권한과 디렉토리 접근.. 2021. 1. 19.
개발 이슈 모음 1. Spring Security X-Frame-Options 이슈 Default Security Headers Cache-Control: no-cache, no-store, max-age=0, must-revalidate Pragma: no-cache Expires: 0 X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000 ; includeSubDomains X-Frame-Options: DENY X-XSS-Protection: 1; mode=block cf) Strict-Transport-Security는 HTTPS 요청일때만 추가된다. X-Frame-Options: DENY response header에 X-Frame.. 2021. 1. 19.