컴퓨터와 컴퓨터가 소통 하기 위해 사용 되는 부분을 간략히 정리 해보자.
우편물 배송에 비유하면 단순 집 주소 만으로는 누구에게 전달할지 알 수 없기 때문에, 집 주소와 더불어 받는 사람 이름까지 적어줘야 정확한 배송을 받을 수 있다. 이 때, 집 주소에 해당 하는 것이 IP이며, 받는 사람 이름이 Port다
.
집 주소
: IP받는 사람 이름
: Port0 ~ 65535
, `16비트 숫자로 구성됨`.0 ~ 1023
포트 번호는 잘 알려진 포트 번호로 웹 서버
, 메일 서버
같은 프로그램들이 사용한다.1024 ~ 49151
포트 번호는 잘 알려지지 않은 프로그램들이 사용한다.49152 ~ 65535
포트 번호는 서버가 클라이언트를 식별 할때 사용이 된다.HTML
뿐만 아니라, 각종 이미지
, 동영상
, 음성
데이터 전송 가능.웹 서버와
사용자 컴퓨터에 설치된 웹 브라우저 사이에
문서를 전송하기 위한 통신 규약
.HTTP
는 기본 포트인 `80번 포트`에서 서비스 대기중.HTTPS
가 나왔다.Client
가 HttpServletRequest 요청
→ Server
는 HttpServletResponse 객체를 생성 해 반환
.HTTP
는 connectionless
한 프로토콜이다.연결
→ Request
→ Response
→ 모든 처리가 끝나면 연결을 끊는다.
위에서 한 말은 브라우저와 서버가 항상 연결 되어 있지 않다는 것이다.
JavaScript의 Library
중 하나로 비동기 처리 방식을 수행
한다.브라우저
가 가지고 있는 XMLHttpRequest 객체
를 이용 → 페이지 전체를 reloading 하지 않고 데이터 교환.클라이언트와 서버 간에 XML 데이터를 주고받는 기술.
HTTP의 보안성을 증대
시킨 것이 HTTPS
프로토콜이다.서버와 클라이언트 사이의 모든 통신 내용이 **암호화**됨
.SSL
은 Secure Socket Layer
의 약자.웹 서버
와 웹 브라우저 간의 암호화 통신을 위해
응용 계층
과 TCP/IP 계층
에서 동작하는 프로토콜
이다.인증
: 상대 사이트에 대한 신뢰성 인증암호화
: 다양한 암호화 알고리즘을 이용하여 메시지 암호화.무결성
: 송/수신 메시지에 대한 Checksum기능, 변조 방지지원 프로토콜
: HTTPS(port : 443), TELNETS(port : 992), SFTP(port : 22), HTTP(port : 80)User는 Load Balancer로 인해 구분된 서버를 인지 하지 못하고
하나의 WebServer에 접속한다 인식하게 된다.
하나의 인터넷 서비스
가 발생하는 트래픽이 많을 때
여러 대의 서버를 통해 분산 처리
를 수행
하여서버의 로드율 증가
, 부하량
, 속도 저하
등을 적절히 분산 처리 해주는 서비스
.
쉽게 말해, 하나의 웹 서버에 100만명의 사람이 몰렸다 가정해보자. 위 같은 상황에 100만명의 Client를 하나의 서버에서 처리하는데 엄청난 트래픽이 발생
한다. 이러한 부분을 방지하기 위해 AWS에서 제공하는 LoadBalancer를 사용해분리 분산 처리
를 수행 하는 것이다.
→ 물리 계층
→ 데이터 계층
→ 네트워크 계층
→ `전송 계층 [L4영역]`
→ 세션 계층
→ 표현 계층
→ 응답 계층
저렴한 비용
으로 다수의 서버
를 증설
하여 비용 절감
이 가능
하다.대량 트래픽
으로 1대의 서버로 집중적인 부하
가 높아지면 L4 스위치가 이를 감지
해 합리적 부하 분산 처리
.1대의 서버에 장애가 발생
하여도 서비스 중단 없이 다른 서버
로 자동 분배
하여 서비스 운용.1. X-Forwarded-For
→ HTTP 또는 HTTPS 로드 밸런서를 사용할 때 클라이언트의 IP 주소를 식별하는 데 도움을 줍니다.
2. X-Forwarded-Proto
→ 클라이언트가 로드 밸런서 연결에 사용한 프로토콜(HTTP 또는 HTTPS)을 식별하는 데 도움을 줍니다.
3. X-Forwarded-Port
→ 클라이언트가 로드 밸런서 연결에 사용한 포트를 식별하는 데 도움을 줍니다.
ex) String ip = request.getHeader("X-FORWARDED-FOR")
HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
// 기본적으로 Service 영역에서 HttpServletrequest 객체에 접근하는것은 옳지 않다.
// 이때 위 같은 코드를 사용하여 MVC 영역 어디에서든 HttpServletRequest객체에 접근이 가능하다.