TLS 란 TLS(Transport Layer Security) 는 인터넷에서 데이터를 안전하게 암호화하여 전송하는 보안 프로토콜서버 및 클라이언트의 신원을 인증하는 보안 프로토콜이다이 글에선 단방향 인증 방식을 설명 한다인증서 생성1️⃣ root (최상위 인증기관) 서명을 만든다2️⃣ root 서명을 가지고 필요한 사용자의 공개키와 비공개 키를 만든다3️⃣ 사용자는 공개키와 비공개키를 가지고 서버에 요청을 한다root 인증서 생성 openssl genrsa -out rootCA.key 4096openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt -subj "/C=KR/ST=Seoul/L=Gangnam/O=MyCo..
개-발
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2dibp%2FbtsLsi8sPnH%2FAOvOKCR4bFSWvPEz2zWkj0%2Fimg.jpg)
Pub/Sub(발행-구독)형태는 현대 애플리케이션에서 비동기 이벤트를 처리하고 확장성을 확보하는 데 자주 사용되는 설계 방식이다.하지만 이벤트 브로커는 메시지를 발행하고 구독자(Subscriber)가 가져가는 구조에서 몇 가지 중요한 점을 고려해야 한다.RedisRedis 의 pub/sub 은 스트림 형태로publish 한 즉시 데이터가 subscriber 에게 전달되고 소멸되는 특성을 가지고 있다 (휘발성 데이터)각 이벤트/메세지 브로커 마다 특성이 있으니 사용시 주의 하도록 하자1. 메시지 중복publisher 는 멱등성 프로듀서를 지원하는 이벤트 브로커도 있다하지만 주는쪽 말고 받는 쪽에서도 중복처리에 대한 멱등성 처리를 신경써야 한다.Unique key를 두어 데이터의 중복을 방지한다 ( 타임스탬..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHqMIK%2FbtsLiHGSFPA%2FxpnHVVjFr7Kd7qTlGMcdN0%2Fimg.gif)
멱등성멱등성이랑 데이터가 중복으로 요청되더라도 응답과 시스템 상태가 항상 같아야(일관성이 있어야) 한다.응답fun print(text: String) = text특정 문자를 받아서 문자 그대로를 리턴하는 코드처럼 같은 요청에 같은 응답을 받는것이다.시스템 상태특정 인스턴스를 생성해서 저장하는 요청이라고 하면 리소스가 시스템에 계속 생성이 될 것이다.이러면 시스템 상태에 영향을 주어, 멱등성이 없다라고 한다.멱등성 보장멱등성을 보장 해주기 위해 비즈니스 로직에서 처리하는 방법으로는ID 키를 활용한 중복 생성방지요청마다 유니크한 필드를 기준으로 db에 저장시켜준다.데이터 저장시 특정 필드를 조회하여 비교 후 존재하면 존재하는 데이터를 응답시켜주기도 , 예외를 던져주기도 한다.캐시요청 후 생성된 유니크한 ID..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FALxXH%2FbtsK4axCH0u%2FUBW9A6KMo0fKL7GoYEu2Fk%2Fimg.png)
Here - 익명 커뮤니티 플랫폼익명 커뮤니티 앱은 사용자들이 자유롭게 의견을 나눌 수 있는 공간을 제공하지만, 이러한 익명성이 오히려 악용될 가능성도 존재한다.잘못된 방향으로 사용될 경우 커뮤니티가 의도치 않게 부정적인 영향을 받을 수 있기 때문에, 이를 예방하고 건강한 커뮤니티 문화를 유지하기 위해 여러 기술적 장치를 도입을 했다.이메일 OAuth2 등 기본적인 계정 생성은 계정차단을 회피 할 수 있기 때문에 핸드폰 인증시스템을 도입하게 되었다.Simple & Easy Notification Service가격가격은 다른 플랫폼에 비해 비교적 싼 편이다. 월 50건을 제공하고 건당 9원의 가격이 과금된다. 준비사항발신 번호 ( 전화 , 개인 핸드폰 )듀얼넘버 X ( 안됌 ) 해봄...결국 인터넷 전화를..
problem요청처리가 완료된 후 ServletRequest 의 body 를 log 로 남기려고 했다.ServletRequest 는 inputStream 이므로 한번 밖에 읽을 수 없다.Controller 는 RequestBody 로 서블릿 request 를 읽는다. 그래서 인터셉터로 구현한 log인터셉터에서 body 가 빈값으로 들어오는 것이었다.검색해보니 ContentCachingRequestWrapper 로 request를 래핑 해주라는 말이 있었는데ContentCachingRequestWrapper(request)필터에서 래핑해줘도 스프링시큐리티에서Servlet3SecurityContextHolderAwareRequestWrapper 클래스로 래핑해서 컨트롤러에 전달하는 상황이 발생했다.solu..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1Hjjo%2FbtsKMZvGgcm%2F5Zef4lGtksbkP3cbKzLn2k%2Fimg.png)
동시에 몇개의 요청을 받았을때 서버의 에러가 급격하게 늘까 ? ( 임계점 식별 )각 HTTP 메서드마다 얼마의 요청을 버틸 수 있을까 ? ( 병목 구간 개선 )각 테스트는 가장 무겁고 처리 로직이 복잡한것으로 선택한다.테스트는 POST / GET 이 있다.GET게시물 조회를 선택했다.게시물 조회는 현재 게시물의 좋아요 개수, 댓글 개수 , 각 댓글의 좋아요 갯수 , 대댓글 갯수 , 페이징 처리 , 차단 유저 제외데이터를 가져오도록 설계되어, 많은 테이블의 조인과 서브쿼리가 사용되어 무겁다고 판단 하였다.Post 게시물 생성 API 를 선택했다.게시물 생성로직은 여러 파일이 전송 되어야 해서 선택 하게 되었다.RPS: 초당 요청 수(request per sec)TPS: 초당 트랜잭션 처리 수 (transa..
엔그라인더로 파일 전송 테스트를 하거나 multipart-form 형식 요청의 스크립트 작성 방법scriptimport groovy.json.JsonBuilderimport static net.grinder.script.Grinder.grinderimport static org.junit.Assert.*import static org.hamcrest.Matchers.*import net.grinder.script.GTestimport net.grinder.script.Grinderimport net.grinder.scriptengine.groovy.junit.GrinderRunnerimport net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVkhG2%2FbtsKNfq2c1l%2FG6Z7bAKZb71qnmkQ90R7z0%2Fimg.png)
설치https://github.com/naver/ngrinder/releases Releases · naver/ngrinderenterprise level performance testing solution. Contribute to naver/ngrinder development by creating an account on GitHub.github.comwar 파일을 받아준다실행java -Djava.io.tmpdir={설정디렉토리} -jar {ngrinderWar파일}//exjava -Djava.io.tmpdir=/Users/hi/Desktop/ngrinder -jar ngrinder-controller-3.5.9-p1.warlocalhost:8080에 접속하면 nginder 페이지가 나온다.초기 로..