TCP(Transmission Control Protocol)에 대해서 TCP 는 네트워크 프로토콜의 국제표준기준 OSI 7 계층(Open System Interconnect)의 4 계층 (Transport) 속하며, 3 계층(Network)의 IP 프로토콜과 같이 사용되기 때문에, “TCP/IP” 라고도 불 린다. TCP 의 사용의 가장 큰 목적은 컴퓨터에서 실행되는 프로그램 간 데이터 유실 없이 안정적으로 전송하는 것이다.
데이터 유실을 최소화 하기 위하여 현재 가장 대표적으로 사용중인 전송 프로토콜이다.
TCP는 신뢰성있는 연결을 추구하기 때문에 연결을 생성하고 종료하는 순간에도 나름의 신뢰성 확보를 위해핸드쉐이크(Handshake)라고 하는 특별한 과정을 거치게 된다. TCP를 사용하여 통신을 하는 각 종단은 핸드쉐이크 과정을 통해 어떤 TCP 옵션들을 사용할 지, 패킷의 순서 번호 동기화와 같이 통신에 필요한 몇 가지 정보를 주고 받는다.
TCP는 전화를 거는 것처럼 상대와 연결을 설정하고 통신을 시작한다. 절차는 아래와 같다.
Three Way Handshake
1) 클라이언트가 TCP 연결을 위하여 SYN패킷을 보내어 연결 요청 =
상대에게 통신을 하고 싶다는 메시지를 보낸다. (SYN)
2) 서버가 SYN 패킷을 받고, 클라이언트로 받았다는 신호인 ACK와 SYN 패킷을 전송 해 준다.
상대는 그 메시지에 대한 응답 + 나도 통신 준비가 되었다는 메시지를 보낸다. (SYN-ACK)
3)클라이언트는 SYN + ACK 신호를 받았다는 의미로 ACK 패킷을 서버에 다시 보내어준다.
2번에서 받은 메시지에 응답을 보낸다. (ACK)
이와 같은 과정을 통해 나와 상대가 통신준비를 마쳤고, 현재 통신이 연결되어 있음을 보장하게 된다. 기존의 회선교환 방식과 유사하지만 단순히 서로 연결되어 있다는 것만 보장한다.
TCP 연결 해제 4-way Handshaking 사용
1)클라이언트는 서버에게 TCP 연결 종료를 위하여 TCP 헤더 flag에 있는 FIN을 보낸다.
새로운 request를 보낼 때마다 **인가(Authorization)**를 위해 해당 세션/토큰을 함께 보냅니다.
인증과 인가
세션 기반 인가와 토큰 기반 인가에 대해 알아보기 이전에 먼저, 인증과 인가가 무엇인지 부터 알아야할 필요가 있다. 인증과 인가를 같거나 비슷한 개념이라고 생각하는 사람들이 많을텐데, 엄밀하게는 서로 다른 개념이다. 인증과 인가는 요약하자면 시스템의 자원을 적절하고 유효한 사용자에게 전달하고 공개하는 방법이다.
인증에는 클라이언트의 쿠키 저장소에 Key-Value 형식의 문자열 방식을 저장시켜 고유 정보 식별 가능!
인증 (Authentication)
인증은 쉽게 말하자면, 로그인 이다. 클라이언트가 자기자신이라고 주장하고 있는 사용자가 맞는지를 검증하는 과정이다. 예를 들어 로그인 화면에서 내가 유저 아이디를 USER1 로 입력하고 패스워드를 입력해 제출하면, 서버에서는 내가 진짜로 USER1 이라는 유저가 맞는지 확인한다.
인가 (Authorization)
인가는 인증 작업 이후에 행해지는 작업으로, 인증된 사용자에 대한 자원에 대한 접근 확인 절차를 의미한다. 쉽게 말해서 권한! 기본 장고에서는 유저가 동일한지 함수로 체크했지만
DRF에서는 Permission를 통해 권한을 부여했음
여기에 일반 유저인 USER1과 USER2가 있다. 일반 유저인 USER1 은 글 작성, 조회, 수정, 삭제 등 일반적인 작업에 대한 권한이 부여되어 있다. 하지만 USER1 은 USER2가 작성한 글을 수정하거나 제거할 수는 없다. 타인의 리소스에 대해서는 인가되어 있지 않기 때문이다. 또한 USER1과 USER2 는 모두 관리자 페이지에 접속할 수 없다. 일반 유저는 관리자 페이지에 대해 인가되어 있지 않기 때문이다.
쿠키-세션-토큰(JWT)
1.쿠키 (Cookie) - 클라이언트의 브라우저에 설치
쿠키는 Key-Value 형식의 문자열 덩어리이다.
클라이언트가 어떠한 웹사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버를 통해 클라이언트의 브라우저에 설치되는 작은 기록 정보 파일이다.
각 사용자마다의 브라우저에 정보를 저장하니 고유 정보 식별이 가능한 것이다.
Cookie 인증방식의 단점
보안에 취약함 가장 큰 문제 .요청 시 쿠키의 값을 그대로 보내기 때문에 유출 및 조작 당할 위험이 존재한다.
웹 브라우저마다 쿠키에 대한 지원 형태가 다르기 때문에 브라우저간 공유가 불가능하다.
쿠키에는 용량 제한이 있음
쿠키 사이즈가 크면 네트워크 부하가 심해짐.
2. 세션 Session - 서버에 저장
이러한 쿠키의 보안적인 이슈 때문에, 세션은 비밀번호 등 클라이언트의 민감한 인증 정보를 브라우저가 아닌 서버 측에 저장하고 관리한다.
서버의 메모리에 저장하기도 하고, 서버의 로컬 파일이나 데이터베이스에 저장하기도 한다.
핵심 골자는 민감한 정보는 클라이언트에 보내지 말고 서버에서 모두 관리한다는 점이다.
Session 방식의 단점
쿠키를 포함한 요청이 외부에 노출되더라도 세션 ID 자체는 유의미한 개인정보를 담고 있지 않는다.그러나 해커가 세션 ID 자체를 탈취하여 클라이언트인척 위장할 수 있다는 한계가 존재한다. (이는 서버에서 IP특정을 통해 해결 할 수 있긴 하다)
서버에서 세션 저장소를 사용하므로 요청이 많아지면 서버에 부하가 심해진다.
3.Token 인증
토큰 기반 인증 시스템은 클라이언트가 서버에 접속을 하면 서버에서 해당 클라이언트에게 인증되었다는 의미로 '토큰'을 부여한다.
이 토큰은 유일하며 토큰을 발급받은 클라이언트는 또 다시 서버에 요청을 보낼 때 요청 헤더에 토큰을 심어서 보낸다.
그러면 서버에서는 클라이언트로부터 받은 토큰을 서버에서 제공한 토큰과의 일치 여부를 체크하여 인증 과정을 처리하게 된다.
기존의 세션기반 인증은 서버가 파일이나 데이터베이스에 세션 정보를 가지고 있어야 하고 이를 조회하는 과정이 필요하기 때문에 많은 오버 헤드가 발생한다.
하지만 토큰은 세션과는 달리 서버가 아닌 클라이언트에 저장되기 때문에 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 덜 수 있다.
토큰 자체에 데이터가 들어있기 때문에 클라이언트에서 받아 위조되었는지 판별만 하면 되기 떄문이다.
토큰은 앱과 서버가 통신 및 인증 할 때 가장 많이 사용된다.
왜냐하면 웹에는 쿠키와 세션이 있지만 앱에서는 없기 때문이다.
Token 방식의 단점
쿠키/세션과 다르게 토큰 자체의 데이터 길이가 길어, 인증 요청이 많아질수록 네트워크 부하가 심해질수 있다.
Payload 자체는 암호화되지 않기 때문에 유저의 중요한 정보는 담을 수 없다.
토큰을 탈취당하면 대처하기 어렵다. (따라서 사용 기간 제한을 설정하는 식으로 극복한다
4.JWT Token
JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미한다.
그리고 JWT 기반 인증은 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방식이다
JWT는 JSON 데이터를 Base64 URL-safe Encode 를 통해 인코딩하여 직렬화한 것이며, 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 들어있다.
따라서 사용자가 JWT 를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치게 되며 검증이 완료되면 요청한 응답을 돌려준다.
JWT 구조
JWT는 . 을 구분자로 나누어지는 세 가지 문자열의 조합이다.
.을 기준으로 좌측부터 Header, Payload, Signature를 의미한다.
JWT 장점
Header와 Payload를 가지고 Signature를 생성하므로 데이터 위변조를 막을 수 있다.
인증 정보에 대한 별도의 저장소가 필요없다.
JWT는 토큰에 대한 기본 정보와 전달할 정보 및 토큰이 검증됬음을 증명하는 서명 등 필요한 모든 정보를 자체적으로 지니고 있다.
클라이언트 인증 정보를 저장하는 세션과 다르게 , 가 되어 서버 확장성이 우수해질 수 있다.서버는 무상태
토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능하다. (쿠키와 차이)
OAuth의 경우 Facebook, Google 등 소셜 계정을 이용하여 다른 웹 서비스에서도 로그인을 할 수 있다.
모바일 어플리케이션 환경에서도 잘 동작한다. (모바일은 세션 사용 불가능)
JWT 단점
Self-contained : 토큰 자체에 정보를 담고 있으므로 양날의 검이 될 수 있다.
토큰 길이 : 토큰의 Payload에 3종류의 클레임을 저장하기 때문에, 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.
Payload 인코딩 : payload 자체는 암호화 된 것이 아니라 BASE64로 인코딩 된 것이기 때문에, 중간에 Payload를 탈취하여 디코딩하면 데이터를 볼 수 있으므로, payload에 중요 데이터를 넣지 않아야 한다.
Store Token : stateless 특징을 가지기 때문에, 토큰은 클라이언트 측에서 관리하고 저장한다. 때문에 토큰 자체를 탈취 당하면 대처하기가 어렵게 된다.
JWT의 Access Token / Refresh Token 방식
JWT도 제 3자에게 토큰 탈취의 위험성이 있기 때문에, 그대로 사용하는것이 아닌 Access Token, Refresh Token 으로 이중으로 나누어 인증을 하는 방식을 현업에선 취한다.
Access Token 과 Refresh Token은 둘다 똑같은 JWT이다. 다만 토큰이 어디에 저장되고 관리되느냐에 따른 사용 차이일 뿐이다.
Access Token : 클라이언트가 갖고 있는 실제로 유저의 정보가 담긴 토큰으로, 클라이언트에서 요청이 오면 서버에서 해당 토큰에 있는 정보를 활용하여 사용자 정보에 맞게 응답을 진행
Refresh Token: 새로운 Access Token을 발급해주기 위해 사용하는 토큰으로 짧은 수명을 가지는 Access Token에게 새로운 토큰을 발급해주기 위해 사용. 해당 토큰은 보통 데이터베이스에 유저 정보와 같이 기록.
개념이 생소할수 있지만 Access Token은 우리가 지금까지 설명한 JWT를 말하는 것이라고 보면 된다.
정리하자면, Access Token은 접근에 관여하는 토큰, Refresh Token은 재발급에 관여하는 토큰의 역할로 사용되는 JWT인 것이다.
호스트의 도메인 이름을 IP 주소로 변환하거나 반대의 경우를 수행할 수 있도록 개발된 데이터베이스 시스템이다.
브라우저의 검색창 naver.com을 입력
이 요청은 DNS에서 IP 주소(125.209.222.142)를 찾는다.
그리고 이 IP 주소에 해당하는 웹 서버로 요청을 전달 하여 클라이언트와 서버가 통신
아마존 Route53
사용자가 웹 브라우저를 열어 주소 표시줄에 www.example.com을 입력하고 Enter 키를 누릅니다.
www.example.com에 대한 요청은 일반적으로 케이블 인터넷 공급업체, DSL 광대역 공급업체 또는 기업 네트워크 같은 인터넷 서비스 제공업체(ISP)가 관리하는 DNS 해석기로 라우팅됩니다.
ISP의 DNS 해석기는 www.example.com에 대한 요청을 DNS 루트 이름 서버에 전달합니다.
ISP의 DNS 해석기는 www.example.com에 대한 요청을 이번에는 .com 도메인의 TLD 이름 서버 중 하나에 다시 전달합니다. .com 도메인의 이름 서버는 example.com 도메인과 연관된 4개의 Amazon Route 53 이름 서버의 이름을 사용하여 요청에 응답합니다.
ISP의 DNS 해석기는 Amazon Route 53 이름 서버 하나를 선택해 www.example.com에 대한 요청을 해당 이름 서버에 전달합니다.
Amazon Route 53 이름 서버는 example.com 호스팅 영역에서 www.example.com 레코드를 찾아 웹 서버의 IP 주소 192.0.2.44 등 연관된 값을 받고 이 IP 주소를 DNS 해석기로 반환합니다.
ISP의 DNS 해석기가 마침내 사용자에게 필요한 IP 주소를 확보하게 됩니다. 해석기는 이 값을 웹 브라우저로 반환합니다. 또한, DNS 해석기는 다음에 누군가가 example.com을 탐색할 때 좀 더 빠르게 응답할 수 있도록 사용자가 지정하는 일정 기간 example.com의 IP 주소를 캐싱(저장)합니다. 자세한 내용은 Time to Live(TTL)를 참조하세요.
웹 브라우저는 DNS 해석기로부터 얻은 IP 주소로 www.example.com에 대한 요청을 전송합니다. 여기가 콘텐츠가 있는 곳으로, 예를 들어 웹 사이트 엔드포인트로 구성된 Amazon S3 버킷 또는 Amazon EC2 인스턴스에서 실행되는 웹 서버입니다.
192.0.2.44에 있는 웹 서버 또는 그 밖의 리소스는 www.example.com의 웹 페이지를 웹 브라우저로 반환하고, 웹 브라우저는 이 페이지를 표시합니다.
통신 프로토콜 또는 통신 규약은 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 규칙의 체계이다. 즉 상호간에 미리 약속된 통신 규약 및 약속이다.
프로토콜은 데이터를 송수신하기 위한 규칙을 말한다.
손님이 주문을 받는 사람에게 대뜸 찾아가, 외계어로 주문을 할 수 없다.
주문을 하기 위해서는 꼭 지켜야 하는 약속이 몇가지 존재한다.
통신하기 위한 다양한 방법이 존재한다.
직원에게 주문, 앱에서 주문, 키오스크 주문을 할 수 있다.
이러한 방법 하나하나를 전부 프로토콜이라고 할 수 있다.프로토콜은 각각의 프로토콜마다 지켜야 하는 규약이 존재한다.
MDN에서의 “HTTP 메시지” 라는 항목을 잘 살펴보면, HTTP 만의 규칙이 있음을 발견할 수 있다.
송신자와 수신자 사이에 "데이터 구조는 이런식으로하고", "그건 이런 의미이고", "속도는 어느 정도로 보내고" 그런식으로 보내기로하자. 라고 약속을 한 것
프로토콜의 기본 요소
구문(Syntax) : 전송하고자 하는 데이터의 형식(Format), 부호화(Coding), 신호 레벨(Signal Level) 등을 규정
의미(Semantics) : 두 기기 간의 효율적이고 정확한 정보 전송을 위한 협조 사항과 오류 관리를 위한 제어 정보를 규정 (제어정보를 통해 에러처리)
시간(Timing) : 두 기기 간의 통신 속도, 메시지의 순서 제어 등을 규정 (시스템간의 정보전송을 위한 속도와 시간순서 관리)
프로토콜 종류
프로토콜의 기능
**단편화(Fragmentation)와 재합성(Assembly)**단편화 : 송신 측에서는 긴 데이터 블록을 손쉽게 전송할 수 있도록 크기가 똑같은 작은 블록으로 나누어 전송재합성 : 수신 측에서 쪼개진 작은 데이터 블록을 재합성하여 원래의 메시지로 복원하는 기능
(패킷 단위로 나눠진 데이터들을 규약에 따라 다시 재조합하거나 , 패킷단위로 나누는것)
**캡슐화(Encapsulation)**각 프로토콜에 적합한 데이터 블록을 만들려고 데이터에 정보를 추가하는 것플래그, 주소, 제어 정보, 오류 검출 부호 등을 부착하는 기능
(각각의 데이터블록의 내용들을 소형 상장에 담아 큰 상자에 넣어준 뒤 필요 데이터를 헤더에 담아서 보냄 )
**연결 제어(Connection Control)비연결 데이터 전송(데이터그램)과 연결 위주 데이터 전송(가상회선)을 위한 통신로를 개설·유지·종결하는 기능흐름 제어(Flow Control)데이터양이나 통신속도 등이 수신 측의 처리 능력을 초과하지 않도록 조정하는 기능오류 제어(Error Control)데이터 전송 중 발생할 수 있는 오류나 착오 등을 검출하고 정정하는 기능순서 결정(Sequencing)**연결 위주의 데이터를 전송할 때 송신 측이 보내는 데이터 단위 순서대로 수신 측에 전달하는 기능
(각 데이터의 전송 시간과 양을 조절한다)
동기화
**주소 설정(Addressing)발생지, 목적지 등의 주소를 명기하여 데이터를 정확하게 전달하는 기능동기화(Synchronization)두 통신 객체의 상태(시작, 종류, 검사 등)를 일치시키는 기능다중화(Multiplexing)하나의 통신로를 여러 개로 나누거나 회선 여러 개를 하나의 통신로로 변환시켜 다수의 가입자가 동시에 사할 수 있도록 하는 기능전송 서비스(Transmission Service)**통신 객체를 사용하기 쉽도록 별도로 추가 서비스(패리티 검사, 보안도, 서비스 등급, 우선순위 등)를 제공하는 기능