Open longlivedrgn opened 5 months ago
OSI 7계층
Internet 프로토콜 스택
기본적으로 iOS는 URLSession을 통해서 네트워크 통신을 한다.
HTTP
HTTPS
iOS는 보안 통신을 위하여 ATS라는 기능을 활용한다.
특징
Rest API는 Rest 원리를 따르는 API를 말한다.
기본적으로 iOS는 Rest API를 통해서 통신을 한다.
(with GPT)
HTTP 상태 코드
HTTP + Secure Socket Layer(SSL) or Transport Layer Security(TLS)
❓SSL(=보안 소켓 계층, 디지털 인증서)와 TLS
: 브라우저(사용자의 컴퓨터)와 서버(웹사이트) 사이의 암호화된 연결을 수립하는데 사용한다.
TLS는 SSL의 업그레이드 버전이며, 현재는 모든 버전의 SSL은 사용되지 않는다.
SSL은 SSL인증서가 있는 웹사이트만 실행할 수 있다.
SSL은 클라이언트와 서버간에 핸드셰이크를 통해 인증이 이뤄진다.
데이터를 암호화하여 제 3자가 데이터를 중간에 가로채더라도 내용을 해독할 수 없게 만든다.
SSL/TLS는 공개 키 암호화 방식을 사용해 데이터를 보호한다.
: 네트워크 상 데이터를 내보내거나, 데이터를 받기 위한 실질적인 통로, 인터페이스 역할을 한다.
: 서버가 리소스(resource)를 이용해 무엇을 해야하는지 말해주는 명령어
: 특정 http 요청이 성공적으로 완료되었는지 알려주는 코드
HTTP와 HTTPS의 차이점은 Secure의 유무로 보통 TLS를 의미합니다. Secure의 유무가 있다는 것은, 자연스럽게 HTTP는 안전하지 않다는 것을 연상할 수 있는데요. 실제로 HTTP는 암호화를 하지 않은 메시지를 주고 받기 때문에 나쁜 의도를 가진 사람이 이를 들춰보고 악용할 수도 있습니다. 이를 방지하기 위해 도입된 계층이 구 SSL, 현 TLS이며 인증기관을 통해 서버와 연결되는 과정을 거칩니다.
iOS를 포함한 애플 플랫폼에서 일반적인 통신은 Foundation의 URLSession 타입을 통해 이루어지는데요. 정확한 상하관계는 기억이 나지 않지만, ATS라고 하는 기능이 이 URLSession의 통신에 통제권을 가지고 안전하지 않은 통신들은 차단하게 됩니다. 결과적으로 보통 HTTPS만을 사용하고 특수한 경우 WSS도 사용을 하게 되는데요. HTTP를 포함한 그 외의 프로토콜로 통신을 하기 위해서는 ATS에게 이 프로토콜을 통해서 통신을 할 것이라고 명시를 해주어야합니다.
잘 기억이 나지 않는데... TCP가 Transmission control protocol, UDP가 User datagram protocol인 것으로 기억하는데요. 둘다 통신규약인데 TCP가 순서를 보장하고 UDP가 보장이 되지 않는 것으로 알고 있습니다. 실제로 주고 받게 되는 데이터의 성격에 따라 달리 사용할 수 있을 것 같은데, 순서가 보장되지 않아도 되는 데이터가 무엇이 있을지 제가 고민하거나 경험해본 적이 없어서 잘 모르겠네요. 당장 생각나는 건 스팸메일...? 일반적으로 통신을 할 때 HTTPS를 사용하는데 얘가 HTTP가 밑에 깔려있고, HTTP가 TCP/IP의 확장인 것으로 알고 있어서 UDP보다는 TCP가 대중적인 게 아닌가 싶습니다.
저희가 흔히 사용하는 게 HTTP 프로토콜이기 때문에 HTTP와 비교를 해보면, HTTP는 클라이언트의 일방적인 요청과 서버의 응답으로 통신이 구성됩니다. 나아가 HTTP로 통신하는 경우 서로 다른 컴퓨터 간의 연결을 지속시키기 위해 세션이라는 기술을 이용하게 되는데요. 실제로 연결이 된 건 아니지만, 마치 연결이 된 것처럼 통신을 기록하게 됩니다. 이 과정에서 또 많은 비용이 발생하게 됩니다.
소켓 통신은 여기서 클라이언트의 일방적인 요청
과 연결을 지속시키기 위한 비용
이라는 문제를 해결하는 프로토콜로 양방향 통신이 가능한 프로토콜입니다.
REST API의 REST는 Representational state.... 뭐시기... 인데요... transfer? transmission? 정확히 기억이 안나네요. 어쨌거나 서버 아키텍처의 한 종류로, 자원을 명시적으로 쉽게 구분하고 주고 받기 위한 약속입니다. 특히 HTTP 통신에서 URI와 HTTP Method를 잘 사용하여 서로 오해가 발생하지 않도록 하는데에 목적이 있습니다. 예를 들면 myhompage.com/myId/name에 GET으로 접근하면 해당 아이디의 사용자명을 myhomepage를 운영하는 서버가 건네주고, 또 같은 URI에 PUT method로 페이로드를 작성하면, 해당 페이로드로 사용자명이 갱신되는 맥락입니다. 앞서 말씀드렸듯이 iOS도 URLSession을 사용하고, HTTPS를 기본적으로 사용합니다. 즉 HTTP Method를 그대로 사용하게 되는데요. 필요한 URLRequest를 만들어서 어떤 자원에 대해 무엇을 요구하는지를 명시해서 서버에 전달하면, 해당 결과값과 함께 응답상태, 에러 등을 전달받고 이를 핸들링하게 됩니다.
메소드가 많아서 모두 기억하지는 못하기 떄문에, 모든 차이점을 나열하기는 어려울 것 같은데요. 일반적으로 사용하는 GET, POST, PUT, DELETE 정도만 이야기를 해보겠습니다. GET과 DELETE는 이름 그대로 자원을 얻거나, 삭제하는데 사용하는 메소드입니다. POST는 영화 포스터를 벽에 붙이거나, 블로그 포스트를 인터넷에 올리거나 하는 이미지를 연상하시면 좋은데요. 새로운 자원을 등록하는 메소드입니다. PUT은 이미 존재하는 자원을 갱신하는 메소드입니다. 이 맥락에서 POST과 PUT이 분명히 비교가 되지만, 특히 이 둘을 구분하는데에 자주 사용되는 말이 멱등성인데요. POST는 새로운 자원을 등록하는 것이기 때문에 완전히 똑같은 요청이 여러번 발생하면 그만큼 똑같은 자원이 많이 생성되지만, PUT은 이미 있는 자원을 갱신하는 것이기 때문에 아무리 많이 요청을 하더라도 모든 결과가 같습니다.
HTTP 통신이 이루어진 뒤, 해당 통신의 결과에 대해서 맥락을 구분할 수 있도록 미리 약속한 범주입니다. 신호등이 빨강색이면 건너면 안된다는 것처럼요. 크게 분류하면 200번대가 성공, 300번대가 리다이렉트, 400번대가 클라이언트 에러, 500번대가 서버 에러인데요. 이러한 코드를 내려주는 것도 사람이 개발을 해야하기 때문에 맹신할 수는 없고, 상태코드와 함께 내려주는 결과값들을 분석하고 납득이 되지 않는다면 서버 개발자와 이야기할 필요가 있습니다.
HTTP와 HTTPS의 차이점, iOS에서의 보안 통신 방법에 대해 설명해주세요. HTTP 상태 코드에 대해서 설명해주세요.
HTTP는 Hypertext Transfer Protocol의, HTTPS는 Hypertext Transfer Protocol Secure의 줄임말이다. 즉 'secure'가 둘의 핵심적인 차이점이다. HTTPS는 SSL(Secure Sockets Layer)나 TLS(Transport Layer Security)를 사용하여 데이터를 암호화하기 때문에 보안 측면에서 HTTP보다 월등히 낫다. iOS는 ATS(App Transport Security)를 통해, 그리고 개발자들이 URLSession을 쓰도록 함으로써 'https'를 쓰도록 하고 있다. 또한 다양한 데이터 암호화 방법을 제시하고 권장한다.
TCP와 UDP의 차이점에 대해서 설명해 주세요. 소켓 통신에 대해 설명해주세요.
위 'SSL'의 중간 S는 '소켓'이다. 소켓이란 네트워크를 통해 데이터를 주고받는 양 끝점을 일컫는 말이다. 어떤 프로토콜을 사용하여 통신하냐에 따라 TCP 소켓과 UDP 소켓 두 가지 유형으로 나뉜다. TCP는 Transmission Control Protocol의, UDP는 User Datagram Protocol의 준말이다. UDP는 제어 프로토콜이 덜하여 연결 설정 없이 즉시 데이터를 전송하므로 신뢰성을 덜 보장하지만 속도가 빠르다. 실시간 스트리밍 등에 주로 사용된다. 반면 TCP는 순서가 바뀌면 재전송하는 등 어느 정도의 신뢰성을 보장한다. 따라서 정보의 무결성이 중요한 이메일, 파일 전송 등에 사용된다. 소켓 통신이란, 이렇게 (앱이나 기능의 성격에 따른 프토토콜을 사용하여) 소켓을 생성하고 이 극단을 통해 서버와 클라이언트 간에 정보를 주고 받는 과정을 말한다.
REST API와 iOS에서의 네트워크 요청 및 응답 처리 방법에 대해 설명해주세요. REST API에서 Method들의 차이점을 설명해주세요.
REST API의 'REST'는 'Representational State Transfer'의 약자다. 효율적인 웹 서비스개발을 위해 개발된 아키텍처로, Get, Post, Put, Delete의 메서드를 통해 의사를 표현하고 데이터를 주고받는다. iOS에서는 URLRequest와 URLResponse를 통해 이를 요청, 구현하고 해석, 처리할 수 있다.
블로그에 기재: https://raidho.tistory.com/277
네트워크 프로토콜은 네트워크 통신을 위한 약속이다.
데이터의 형식, 순서, 시스템과의 조율 등 다양한 역할을 수행한다.
프로토콜 스택은 TCP/IP 4계층과 OSI 7계층 모델이 있으며, 각기 다른 역할로 사용된다.
TCP/IP 모델은 실제 네트워크 작동 방식으로 사용되며 OSI는 교육 혹은 개념적인 모델로 사용
된다.
HTTP는 웹 브라우저와 웹 서버 간 데이터 전송을 위한 프로토콜로 사용자의 요청과 서버의 응답을 주고 받는다. HTTPS는 Secure이 추가된 것으로 데이터 전송을 보호하는 프로토콜이다.
SSL/TLS 프로토콜을 사용하여 통신을 암호화 하여 개인정보 유출을 방지한다. 사용자가 HTTPS에 접속하면 서버에서 인증서를 보내고 인증서가 유효하다면 신뢰할 수 있다고 판단한다. 안전한 통신을 위해 암호화 키를 교환하며 모든 데이터를 암호화하여 전송한다.
Apple은 ATSApp Transport Security라는 네트워킹 기능이 개인 정보 보호 및 데이터 무결성을 향상시킨다. 네트워크 통신을 HTTPS로 강제화한다. HTTPS라도 최소 보안 사양을 충족하지 못하면 연결을 차단한다. 필요한 경우에는 예외를 등록할 수 있지만, 보안을 저하시키는 문제가 있다.
데이터를 보내기 위해 사용하는 프로토콜이다.
TCP는 1:1 통신방식으로 연결지향적이다. 연결지향적은 두 개체 간 연결 상태를 유지하고 교환이 가능한 것으로 논리적으로 이루어진 것이다. 쉽게 이야기하면 양측 협상으로 설정하고 데이터를 교환하고 연결을 종료한다. 신뢰성이 높지만 속도가 느리다. TCP/IP로 쓰이며, IP가 데이터의 배달을 처리한다면 TCP는 Packet을 추적하고 관리한다.
UDP는 비연결형 서비스로 순서화되지 않은 데이터그램 방식을 제공한다. 정보를 주고 받을 때 정보를 보내거나 받는다는 신호절차를 거치지 않는다. TCP보다 속도가 빠르지만 신뢰성이 낮다. 1:1 뿐만 아니다 N:M 등으로 연결될 수 있다. 여기서 데이터 그램은 Packet의 동의어이다.
HTTP 는 버전이 존재하며, 2022년에는 HTTP/3가 출시되었다.
HTTP/2에서는 TCP로 전송이 되었다면 HTTP/3에서는 Quick UDP Internet Connections(QUIC)로 대체
된다.
더 빠르고 짧은 지연시간의 데이터 전송을 위해 UDP를 활용
하게 되었다.
하지만 아직까지 사용되는 사이트는 많지 않다. Google이 개발했으니 H3를 사용하지만 아직 네이버도 H2이다.
네트워크에서 두 개의 프로그램 간 양방향 데이터 전송을 가능하게 하는 통신 방식이다. 클라이언트-서버 모델을 기반으로 작동하며, TCP/IP에서 Transport에 해당한다. 파일 전송, 온라인 게임, 채팅, 원격 제어 등 다양하게 활용된다. Socket을 생성하고 IP주소와 Port 번호를 가지고 통신하게 된다. 서버 측에서는 연결을 수락하고 데이터를 받은 뒤 연결을 끊는다.
RESTREpresentational State Transfer 아키텍처 스타일의 디자인 원칙을 준수하는 API이다. 이러한 이유로 RESTful API라고도 한다.
HTTP 요청을 통해 통신함으로써 리소스 내에서 레코드(CRUD)의 작성, 읽기, 업데이트 및 삭제 등의 표준 데이터베이스 기능을 수행한다. GET 요청을 사용하여 레코드를 검색하고 POST로 요청을 PUT으로 업데이트를 DELETE로 레코드를 삭제한다. 요청 헤더와 매개변수 역시 메타데이터, 권한 부여, URI, 캐싱, 쿠키 등의 식별자 정보를 포함하기에 REST API 호출에서 중요하다. 요청 헤더와 응답 헤더는 일반적인 HTTP 상태 코드와 함께 사용된다.
iOS에서는 URLSession으로 네트워크를 할 수 있으며, httpMethod의 기능들도 사용할 수 있다. 리소스로 표현되는 것은 JSON 혹은 다른 데이터 형식으로 인코딩 및 디코딩하여 내부 데이터를 확인할 수 있다.
클라이언트 요청에 대한 서버에서 보내는 응답이다.
상태 코드 | 분류 |
---|---|
1xx | 요청이 수신되고 이해된 것으로 처리가 계속되는 동안 임시로 발행 |
2xx | 요청이 성공적으로 수신되고 수락된 상태 |
3xx | 요청이 완료되려면 추가 조치가 필요한 상태 |
4xx | 요청에 잘못된 구문이 포함되거나 처리할 수 없는 상태 |
5xx | 서버가 명백히 유효한 요청을 이행하지 못한 상태 |
상태 코드 200이라면 성공적인 HTTP 요청에 대한 응답으로 GET 요청이라면 요청된 리소스에 해당하는 엔티티가 포함된다. 일반적으로는 상태 코드에 맞춰서 동작을 해야하지만 따르지 않는 경우도 있다.