분류 전체보기

· Java
들어가기 지난 포스팅에선 Http 요청 메세지의 가장 마지막에 EOF가 없어 bufferedReader.readline()이 무한 대기 상태에 빠졌었다. EOF는 클라이언트의 연결이 종료돼야 날아오기 때문에 EOF를 기준으로 body를 읽을 수 없었다. 대신 HttpHeader의 Content-Length를 이용해 body를 가져올 수 있다. HttpMessage의 Header를 파싱하자 BufferedReader에서 Header와 Body의 경계인 CRLF까지만 읽도록 한다. public class WebServer { //생략 private static final Map httpHeader = new HashMap(); //생략 } private static void parseHttpRequestHe..
· Java
들어가기 이번엔 클라이언트의 HTTP 메세지를 받아 서버측에서 출력해보자. HTTP 메세지를 BufferedReader로 출력하는 과정에서 Body를 출력하지 못하고 무한정 대기하는 상황이 있었다. 정리를 해보자. 클라이언트 HTTP 요청 클라이언트는 저번과 같이 http://localhost:8081 에서 기동중이다. 아래는 클라이언트 코드다. shot() { var dataToSend = 'Hello Server'; fetch('http://localhost:8080', { method: 'POST', headers: { 'Content-Type': 'text/plain', }, body: dataToSend, }) .then(function (response) { if (!response.ok) {..
· Java
들어가기 C언어를 이용해 네트워크 프로그래밍 수업을 들으며 처음으로 소켓을 이용한 통신을 주고 받아 봤다. 나도 모르는 사이 많은 응용 프로그램을 이용하면서 소켓을 사용했겠지만, 그 내부를 공부하고 구현해 본적은 당연히 없었다... C언어를 통해 윈도우 소켓 프로그래밍을 해보았지만, 자바/스프링 개발자가 되고싶은 나에겐 자바로 소켓 통신을 구현해보고 싶은 생각이 들었고 지금 해보려한다. 소켓 생성 public class WebServer { private static final Logger logger = LoggerFactory.getLogger(WebServer.class); private static final int DEFAULT_PORT = 8080; private static final int..
· Spring
들어가기 밑에서 설명하겠지만 스프링 빈들은 Spring Container에서 관리되기때문에 Spring Container 바깥에서는 자유롭게 접근할 수 없다. 대표적으로 Servlet Container(필터가 존재하는 곳)는 Spring Container에 접근할 수 없는데,,, 왜 굳이 불편하게 접근이 어려운 곳에서 인증과 인가를 처리하는 지 의문이였다. 학습 후 내가 내린 결론은 불편하긴 하지만 서버 깊숙히 들어오기 전(필터 단에서) 모든 인증 인가 처리를 하기위해서라고 생각된다. Servlet Container 흔히 볼 수 있는 클라이언트와 서버간의 통신을 요약해 놓은 그림이다. 스프링부트는 톰캣(WAS)를 내장하고 있기 때문에 스프링을 실행시키면 자동으로 톰캣이 실행된다. 톰캣은 요청을 사용하기 ..
· Spring
들어가기 Http 방식이 가지는 가장 큰 특징 중 하나는 Stateless(무상태) 이다. 즉 서버는 사용자의 로그인상태를 유지하지 않는다. 이 무상태성을 해결하기위해 여러 방법이 존재하고 이 방법들을 알아보자. 매번 로그인 시키자 맞다. 말도 안되는 방식이고 어떤 서비스도 사용자를 매번 로그인 시키며 피로하게 만들지 않는다. 그렇다면 로그인 정보를 매번 전송하자 로그인 정보를 매번 전송해서 서버에게 나의 로그인 상태를 매번 알리는 방법이다. 그렇다면 어떻게 알리는 방법이 좋을까? HTTP Body, Query Parameter 혹은 Cookie에 로그인 정보(id,pw)를 담아 전송할 수 있다. 하지만 로그인 정보는 매우 민감한 정보이기 때문에 탈취당한다면 민감한 정보가 유출된다. 위 방식은 어떻게 해..
· Spring
들어가기 저번 로그인 방식 글에 이어서 JWT를 알아보자. JWT 기반 로그인은 안전한가? 우선 토큰 기반의 로그인 방식은 서버가 생성은 하지만 관리는 클라이언트 측에서 하게된다. 클라이언트측은 토큰의 탈취 가능성을 염두해 예민한 정보는 토큰에 담지 않는다. JWT를 구성하는 Header, Payload, Signiture 3가지 파트 중 Header와 Payload는 base 64로 인코딩 되지만 공격자가 디코딩이 가능하기때문에 유저의 식별정보만 담아야한다. 서버는 사용자 요청이 오면 AccessToken을 생성해 반환한다. 이후 인가처리는 AccessToken 유효성 검사를 통해 위변조를 감지할 수 있다. AccessToken 탈취 AccessToken(이하 AT)을 탈취당할 경우를 대비해 토큰 만료..
· Spring
우선 게시판 프로젝트의 아키텍처를 살펴보면 아래와 같다.  Nginx에서 라운드 로빈 방식으로 부하를 분산하려는 시도를 했다. 원래는 여러 EC2에 스프링 톰캣 서버를 띄워야 EC2하나가 죽더라도 로드밸런싱의 의미가 있지만 작은 프로젝트였기 때문에 하나의 EC2에 Docker compose로 스프링 톰캣 서버를 2개 구축했다. 현재 로그인 방식은 세션 방식이기 때문에 Spring자체 세션 저장소를 이용했다. 사실! Spring서버에는 자체 세션 저장소는 없다. 범위를 벗어나는 이야기이기때문에 길게 설명하진 않겠지만 톰캣의 SESSION.ser 파일에 저장된다. 하지만 지금 WAS가 2개인 상황에선 세션을 고정 시킬 수 없었다. 해결방법을 고민해보던 중 몇 가지 대안을 찾았다. Nginx 로드밸런싱 알고리..
· Spring
https://github.com/SQUAD-D/board GitHub - SQUAD-D/board Contribute to SQUAD-D/board development by creating an account on GitHub. github.com 게시판 프로젝트를 진행하면서 가장 깊은 고민이 였던 부분은 사용자의 고아 이미지 처리였다. 우선 고아 이미지가 어떻게 생성되는지 살펴보자. 사용자의 이미지는 게시글 작성 요청 시점이 아닌 업로드 즉시 AWS S3에 저장된다. @PostMapping(value = "/boards/img") public ImageInfoResponse saveImg( @RequestPart(value = "image") MultipartFile image) { return b..
H@eCh@n
'분류 전체보기' 카테고리의 글 목록 (5 Page)