- 서버/클라이언트 모델에서 사용
- 양방향 통신, 웹상에서의 통신을 위함
- stateLess(무상태) : 상태정보를 저장하지 않음
- connectionless(비연결성) : 응답후 연결 종료
- 이 문제를 해결하기위해 쿠키와 세션을 사용
- 데이터 전송이 종료되어도 연결을 끊기 않고 대기
- 반복되는 요청에 대한 해결방법
- 반복되는 요청은 계속해서 3,4 핸드 쉐이킹이 발생
- Persistance Connection의 기법 종류
- 특정시간동안은 데이터 전송이 없어도 연결 유지
- HTTP에 SSL을 포함 시켜서 암호화가 추가된 프로토콜이 HTTPS
- HTTP 통신중 데이터가 다른 사람에게 조회될 수 있다는 문제를 해결하기 위함
- Body 부분을 암호화(Header는 아님)
- 대칭, 비대칭 암호화 방식 모두 사용
- 비대칭 : 처음 HTTPS 연결을 성립하고 안전하게 세션키를 공유(공개, 비공개키 사용 SSL 인증서내부)
- 대칭 : 처음 연결 이후 교환 과정은 빠른 속도를 위해 사용(세션키)
SSL : 인터넷을 통한 데이터 교환을 보호 하기 위한 프로토콜
- HTTPS는 구간 암호화방식을 사용
- SSL 프로토콜을 사용하여 데이트 통신과정에서 제3자가 데이터를 훔쳐볼 수 없도록
- 클라이언트가 서버로 연결 요청
- 서버가 클라이언트에게 SSL 인증서 전송(SSL인증서에 공개키 포함)
- 클라이언트는 세션 키 생성 후, 공개키로 세션키 암호화
- 서버는 자신의 비공개키로 세션키 복호화
- 이후 서로 세션 키를 이용해서 데이터 암호화해서 교환
둘 다 사용자에 대한 정보 파일을 저장할 수 있음
- 쿠키
- 클라이언트 PC에 저장(통신 x)
- 임시 쿠키 : 메모리 저장, 브라우저 닫으면 사라짐
- 영구 쿠키 : 하드에 저장, 만료기간 되면 사라짐
- 만료시점 설정가능
- 용량이 제한적
- 속도 빠름
- 세션
- 서버에 저장(통신필요)
- 브라우저 종료시 삭제
- 서버가 허용하는 한 제한 없음
- 보안 좋음
- 세션ID를 사용
- 각각의 세션마다 세션 ID를 제공
- 세션 ID는 클라이언트 측에 쿠키로 저장
- 매번 요청할때마다 세션 ID 를 전송
- 이를 서버가 확인하고 해당 세션에 있는 정보를 제공
- 세션ID 정보를 URL에 파라미터로 전송
- 클라이언트는 URL 입력
- DNS서버에서 해당 도메인 주소로 진짜 주소로 연결 => DNS Lookup
- 해당 웹 서버에 TCP 3 handshake 요청
- 클라이언트는 HTTP 요청 보냄(TCP/IP 연결을 통해)
- 웹 서버는 HTTP 응답 메시지 보냄(TCP/IP 연결을 통해)
- HTTP 응답 메시지가 데이터로 변환되고 브라우저를 통해 웹페이지로 출력
데이터를 보내기 위해 사용하는 프로토콜
- TCP
- 연결형
- 전송 순서 보장(신뢰성 좋음, 흐름제어,회선제어,오류제어)
- 속도가 느림
- 수신 여부를 확인(3 way handShake)
- UDP
- 비연결형
- 전송 순서 미보장(신뢰성 좋지않음, 최소한의 오류만 보장)
- 오류를 발견해도 회복하지 않음
- 속도가 빠름
- 수신 여부 미확인
- 3-way-handshake : 장치들 간에 연결이 잘 되어있는지를 확인하는 방법
- SYN - SYN+ACK - ACK
- 4-way-handshake : 장치들 간에 연결을 해제 하는 방법
- FN - ACK- FN - ACK
- 클라이언트가 미처 보내지 못한 데이터가 있을 수 있음
- 때문에 서버는 ACK 응답을 보내고 데이터를 모두 보냈는지 확인후 FIN 응답
- 이 문제를 해결하기 위해서 클라이언트는 FIN 요청을 받아도 연결을 끊지 않음
- 모든 데이터를 정상적으로 받을 때까지 연결 유지
- 3-Way Hankshake의 취약점을 이용한 공격
- 인증된 사용자로 위장해서 계속해서 SYN 요청을 보내서 호스트의 TCP 연결 리소스(SYN Queue)를 점유
- 호스트는 누구에게도 응답할 수 없게돼서 서비스 진행 불가
- 같은 IP주소에서의 SYN 요청 임계치를 설정
- SYN(Backlog) Queue의 크기를 늘려줌
- SYN Cookie 설정
- SYN + ACK 응답시 cookie도 함께 전달하고 클라이언트의 ACK 응답이 오기전까지 SYN Queue에 저장하지 않음
- First SYN Drop
- 첫 번째 SYN 패킷을 Drop하여 재요청 패킷이 도착하는지 확인해서 출발지의 IP 위조를 판단
- 재전송이 이루어지지 않으면 해당 IP는 위조되었을 가능성(공격자는 응답을 받지 못하기 때문)
- Application layer(응용계층) : 사용자에게 통신을 위한 서비스 제공
- Presentation layer(표현 계층) : 받아온 데이터를 데이터 형식에 알맞게 변환
- Session Layer(세션 계층) : 컴퓨터 끼리 통신하기 위한 세션 생성 및 관리
- Transport Layer(전송 계층) : 데이터를 세그먼트 단위로 자르고 관리 및 신뢰성있는 데이터의 전송을 담당
- Network Layer(네트워크 계층) : 패킷(세그먼트+IP헤더)을 목적지까지 보낼 가장 빠른 길 설정(router)
- DataLink Layer(데이터링크 계층) : 프레임 단위로 잘라서 에러와 흐름 관리, 물리적으로 연결된 컴퓨터의 전송 담당
- Physical Layer(물리 계층) : 데이터를 전기신호로 변경
- 통신 표준화 : 네트워크 통신 과정을 표준화하여 다양한 시스템 간의 호환성 향상
- 문제 해결의 용이성 : 통신을 단계적으로 파악할 수 있기 때문에, 문제가 생겼을 경우 그 부분만 수정하는 장점
TCP/IP란, 컴퓨터가 인터넷에 접근하게 하는 네트워크 프로토콜들의 모음
- 주 기능 : 인터넷에서 전송되는 파일들을 패킷들로 나눠 정해진 네트워크 경로를 통해 전송되고 다시 기존의 파일로 재조립
- 4계층 : 네트워크 액세스 계층, 인터넷 계층, 전송 계층, 응용 계층
더 실무적이면서 프로토콜 중심으로 단순화한 모델
- 네트워크 액세스 계층
- 물리적 네트워크의 연결을 담당
- 프레임(비트단위) 단위
- OSI 물리계층 + OSI 데이터 링크 계층 담당
- 인터넷 계층
- 라우팅과 주소지정 담당(경로 지정)
- 패킷으로 분할 및 재조립
- OSI 네트워크 계층
- 전송 계층
- 종단간 데이터를 전송 및 관리
- 데이터 전송에서 신뢰성과 순서를 보장
- 흐름제어, 혼잡제어, 오류제어
- 세그먼트 단위
- 응용 계층
- 사용자와의 상호작용을 담당
- 애플리케이션에서 사용할 수 있는 데이터 형태
전송 계층
- 세그먼트(TCP), 데이터그램(UDP) 단위
- 논리적으로 연결된 장치들의 신뢰성 관련 기능
- 논리적인 연결이란 네트워크를 통한 연결을 의미
한쪽 장치(예: 내 컴퓨터)에서 다른 쪽 장치(예: 서버)로 데이터를 신뢰성 있게 전달하는 역할을 합니다. 즉, 인터넷을 통해 여러 경로를 거쳐야 하는 데이터를 안전하게 도착지까지 보내고, 도착한 데이터가 빠짐없이 정확한 순서로 전달되도록 관리하는 것
데이터 링크 계층
- 프레임 단위
- 물리적으로 연결된 장치들의 신뢰성 관련 기능(인접 노드 간)
- 물리적 연결이란 케이블, 광섬유, 무선등으로 직접 연결된 형태
네트워크의 두 장치(예: 컴퓨터와 라우터)가 직접 연결된 상태에서 데이터가 올바르게 전달되도록 보장하는 역할을 합니다. 쉽게 말해, 두 장치가 물리적으로 연결된 통로(케이블, 무선 등)를 통해 데이터를 전송할 때, 이 과정에서 오류가 없도록 관리하는 것
- 전송계층에서 데이터를 패킷 단위로 분할
- 이 패킷들에는 각각의 순서에 대한 정보 저장
- 이 패킷 번호를 다시 재조합 했을때에 문제 발견
- Stop And Wait
- 매 전송마다 ACK를 확인하며 진행
- 매번 확인하는 과정이 번거로운 단점
- 슬라이딩 윈도우 기법 사용
- 송수신측의 서로 다른 데이터 처리 속도 해결을 위함
- 이를 해결하기위해서 수신측에서의 ACK 응답을 확인한만큼 오른쪽으로 슬라이딩
추가 설명 :
슬라이딩 윈도우 크기를 5로 설정 -> 패킷 크기가 5로 설정
5 크기의 패킷을 보냈는데 2의 응답만 오면 다음패킷(+5)으로 가는 것이 아닌 2만큼(+2) 슬라이딩 윈도우 실행해서 전송
- Go Back N
- 오류 발견시 그 부분으로 돌아가서 다시 전송 시작
- 이미 성공했던 부분 반복의 단점
- Selective repeat
- 오류 발견 부분만 다시 전송
- 수신측 데이터가 순서가 엉켜서 재정렬 필요 단점
- 네트워크 혼잡 문제를 해결하기위함
- 혼잡 문제 : 네트워크 상에 돌아다니는 패킷 수가 증가
- 송신측의 데이터 전송 속도를 제어
- AIMD(Additive Increase, Multiplicative Decrease) : 윈도우 크기를 조절해서 네트워크 혼잡을 방지
- 서버에게 사용자의 목적을 알리는 수단
- GET : 조회
- POST : 등록
- PUT : 수정
- PATCH : 일부 수정
- DELETE : 삭제
-멱등성 : 특정 메서드를 반복해서 실행해도 반복해서 같은 결과를 반환함
- GET, PUT, DELETE가 멱등성
- POST는 계속해서 데이터가 추가되기때문에 멱등성을 띄지 않음
- PATCH 또한, 멱등성을 띄지 않음, Ex. 조회수 증가
- 그렇다면? PUT은? -> PUT의 경우에는 멱등성을 보장, 데이터 전체를 교체하는 역할로 사용되기 때문
- 그렇기에, 조회수 증가와 같은 기능은 PATH를 통해 구현하도록 권장
- 멱등성을 띈다면 캐싱하기 유용하다
- 사용자에 대한 인증 정보를 JSON 형태로 안전하게 보관하는 토큰
- 세션 하이재킹 문제 해결 : 요청중에 쿠키 훔쳐감
- 클라이언트 측에서 관리되고 서버에 요청하며 인증할때 같이 보냄
- 헤더, 내용(페이로드), 서명(시그니처) 으로 '.'으로구분
- 클라이언트 로그인 과정을 통해 accessToken(짧은 만료 시간)과 refreshToken(긴 만료 시간, 더 안전하게 HttpOnly 쿠키 사용 or 서버에서 관리) 발급
=> 추가적으로, refreshToken을 안전한 쿠키에 저장한다면 refresh토큰을 서버에 보내면서 인증과정을 진행하지만, refresh토큰을 서버에 저장한다면, 클라이언트의 식별 정보(사용자 ID or 세션 ID 등)을 통해서 access토큰 발급요청을 하고 서버에서는 DB에 저장된 해당 사용자의 refresh 토큰을 조회하여 검증한다.- accessToken을 통해 요청하고 서버에서 인증하여 통신 진행
- accessToken이 만료되었다면 다시 refreshToken을 갖고 accessToken 재발급 해달라는 요청
- 올바른 refreshToken을 검증받고 accessToken을 재발급
- 세션 기반
- Stateful : 상태를 저장한다.
- 모든 사용자에 대한 정보를 저장 -> 과부하
- 쿠키를 사용하여 세션정보를 조회 -> 쿠키는 단일 도메인에서만 작동하도록 설계
- 단일 도메인에 유리
- 토큰 기반
- Stateless : 상태를 저장하지 않는다.
- 다중 도메인에 유리
- Connection Timeout : 클라이언트에서 문제가 발생해서 서버에 접근하지 못해서 연결해제, 시간 제한이 지남
- Read Timeout : 로직을 수행하는 시간이 길어서 서버가 응답을 주지 못할때 연결 해제
- 공인 IP : 인터넷 서비스 공급자(ISP)가 제공하는 주소, 공개된 IP 주소
- 사설 IP : 로컬 네트워크 IP 주소, 라우터(공유기)를 통해서 PC에 할당
사설 IP는 공인 IP가 할당된 라우터를 통해서 인터넷 연결
포트
- 통신하는 프로세스를 식별하기위해 할당받는 고유한 값
- 하나의 IP당 여러개의 포트가 존재
소켓
- 네트워크 통신을 위한 도구(Ex. 전화기)
- 출발지 포트와 목적지 포트를 연결하는 역할
- TCP, UDP 연결이 소켓을 통해 연결
- 송수신자 모두 소켓을 열어야 연결가능(양방향 통신)
- 한 프로그램은 여러 소켓통신 가능
전체적인 흐름 => HTTP는 TCP를 사용하여 데이터를 전송하려고함, TCP연결을 가능하게 하는 인터페이스 같은 역할이 소켓
비유 => {소켓 : 전화기}, { TCP : 전화 연결 과정}, {HTTP : 전화 대화}
원래의 사이트 주소는 IP주소를 포함하고 있지만 알기쉬운 별명을 주기위해 도메인 주소를 설정
ex)naver.com
- 이러한 도메인 주소를 IP주소로 연결해주는 시스템
Cross-Origin_Resource-Sharing : 교차 출처 리소스 공유
- 한 출처에서 실행 중인 에플리케이션이 다른 출처의 자원에 안전하게 접근할 수 있도록 권한을 부여해주는 정책
- 요청에 들어있는 헤더를 기반으로 출처를 확인
REST : URL을 통해 자원을 명시하고 HTTP Method를 통해 동작을 명시하여 기능을 수행하는 규칙
REST API
- REST를 기반으로 제공되는 API
RESTful
- REST 규칙을 잘 수행하고있는 시스템을 의미
- URL : 자원의 위치를 알려주는 주소
- URI : 자원을 식별할 수 있는 주소