HTTP (HyperText Transfer Protocol)
- 웹 페이지를 요청하고 응답받기 위해 설계된 클라이언트와 서버 간의 기본 *통신 프로토콜이다. 사용자가 웹 브라우저를 통해 웹 페이지를 요청하면, 서버는 그 요청에 대한 응답을 보낸다. 주로 *헤더와 *바디로 구성된다.
- 통신 프로토콜 : 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고받는 양식과 규칙의 체계이다. 즉, 통신 규약 및 약속
- 헤더는 클라이언트와 서버 간의 메타 데이터를 전달하기 때문에, *요청 메서드, URL, 프로토콜 버전, 요청 헤더 등이 포함된다.
- 바디는 클라이언트가 서버에 전송하고자 하는 실제 데이터가 포함되며, JSON, XML, 폼 데이터 등이 포함될 수 있다.
- 데이터를 암호화하지 않은 평문으로 전송하기 때문에 중간에, 누군가가 데이터를 가로챌 수 있어 보안에 취약하다.
- 인증서를 사용하지 않기 때문에 서버의 신원을 확인할 수 없다.
- 뉴스 사이트, 블로그, 정보 제공 사이트와 같이 보안이 필요하지 않은 다양한 웹 애플리케이션에서 사용된다.
HTTP 구조
- 애플리케이션 레벨의 프로토콜로 TCP/IP 위에서 작동한다.
- Method, Path, Version, Headers, Body 등으로 구성된다.
- 연결 상태를 유지하지 않는 무상태(stateless) 프로토콜이기 때문에 각 요청마다 사용자의 정보를 새로 입력해야 하며, 이는 웹 사용성을 떨어뜨린다.
TCP 와 IP 의 주요 기능과 차이점
- *TCP 와 *IP 는 서로 다른 역할을 하지만, 함께 작동하여 인터넷상에서 데이터를 안정적으로 전송한다.
- TCP(Transmission Control Protocol) : 신뢰할 수 있는 데이터 전송을 제공하는 프로토콜
- 데이터 전송 과정에서의 확인 응답과 재전송 기능을 가지고 있기 때문에 데이터가 순서대로, 오류 없이 도착하도록 한다.
- 전송 계층에서 자동한다.
- IP (Internet Protocol) : 패킷의 라우팅과 전달을 담당하는 프로토콜
- 네트워크 간의 데이터 전송 경로를 결정하는 역할을 하기 때문에 데이터 패킷에 주소 정보를 붙여 목적지까지 전송한다.
- 인터넷 계층에서 작동한다.
- TCP(Transmission Control Protocol) : 신뢰할 수 있는 데이터 전송을 제공하는 프로토콜
요청 메서드
- GET : 서버에서 데이터를 조회할 때 사용된다. 데이터를 변경하지 않으며, 주로 데이터를 읽어오는 데 사용된다.
- URL 에 변수(데이터)를 포함시켜 요청한다.
데이터를 Header(헤더)에 포함하여 전송한다.- 간단한 데이터를 URL 에 넣도록 설계된 방식으로 데이터를 보내는 양에 한계가 있다.
- HTTP 자체는 GET 방식의 URL 길이에 제약을 두고 있지는 않지만, 브라우저에서 최대 길이를 제한하고 있으며 URL 형식에 맞지 않는 파라미터 이름이나 값은 인코딩 되어 전달해야 한다.
- 만약 여기서 보내는 길이가 너무 길은 경우 초과데이터는 절단된다.
- URL 에 데이터가 노출되어 보안에 취약하다.
- 데이터가 노출되는 경우는 개인정보가 포함되지 않는 상황에서 캐싱을 통해 속도를 높이거나 즐겨찾기를 편리하게 하기 위해 사용됩니다.
- 우리가 어떤 물건 A 에 대해서 즐겨찾기를 추가하면 그 물건의 이름이 A 라는 정보를 URL 에 추가하여 즐겨찾기를 생성할 수 있는 것이다.
- POST : 서버에 데이터를 추가하거나 수정할 때 사용된다. 데이터를 서버에 전송하며, 주로 폼 데이터를 제출할 때 사용된다.
- URL 에 변수(데이터)를 노출하지 않고 요청한다.
- 데이터를 Body(바디)에 포함시킨다.
- 메시지 길이에 제한은 없지만, 최대 요청을 기다리는 시간인 타임아웃(Time Out)이 존재한다.
- 즉, 클라이언트는 페이지를 요청한 후, 응답을 기다리는 시간이 존재한다.
- 헤더 필드 중 하나인 Content-Type 헤더는 응답 본문(Body)의 데이터 유형을 설명하며, 어떤 데이터 타입인지를 명시해야 한다.
- URL 에 데이터가 노출되지 않으므로 즐겨찾기나 캐싱이 불가능하지만 쿼리스트링(문자열) 데이터뿐만 아니라, 라디오 버튼, 텍스트 박스와 같은 객체들의 값도 전송이 가능하다.
- PUT : 서버에 데이터를 업데이트할 때 사용된다. 지정된 리소스를 업데이트하며, 주로 전체 리소스를 대체할 때 사용된다.
- DELETE : 서버에서 데이터를 삭제할 때 사용된다. 지정된 리소스를 삭제하며, 주로 리소스를 제거할 때 사용된다.
- PATCH : 서버에 데이터를 부분적으로 업데이트할 때 사용된다. 지정된 리소스의 일부를 업데이트하며, 주로 부분적인 변경을 적용할 때 사용된다.
HTTP 상태 코드
- 웹 서버와 클라이언트 간의 통신 결과를 나타내는 코드로, 크게 5가지 범주로 나뉜다.
5가지 범주
- 1xx (정보) : 요청을 받았으며, 처리가 계속되고 있음을 나타낸다.
- 100 (Continue) : 클라이언트가 요청을 계속할 수 있음을 나타낸다.
- 2xx (성공) : 요청이 성공적으로 처리되었음을 나타낸다.
- 200 (OK) : 요청이 성공적으로 처리되었음을 나타낸다.
- 3xx (리다이렉션) : 요청한 리소스가 다른 위치로 이동되었음을 나타낸다.
- 301 (Moved Permanently) : 요청한 리소스가 영구적으로 이동되었음을 나타낸다. 주로 웹 페이지가 새 URL로 이동했을 때 사용되며, 사용자와 검색 엔진이 새 위치로 리디렉션되어야 함을 의미한다.
- 4xx (클라이언트 오류) : 클라이언트의 요청에 오류가 있음을 나타낸다.
- 401 (Unauthorized) : 요청이 인증되지 않았음을 나타낸다. 보안이 중요한 웹 애플리케이션에서 사용자 인증은 필수적이기 때문에, 사용자가 리소스에 접근하기 위해 필요한 권한이 없을 때 발생한다.
- 클라이언트가 인증되지 않았거나, 유효한 인증 정보가 부족하여 요청이 거부되었음을 의미하는 상태값이다, 즉, 클라이언트가 인증되지 않았기 때문에 요청을 정상적으로 처리할 수 없다고 알려주는 것이다.
- 예를 들어 로그인하지 않은 상태에서 결제 내역과 같은 정보를 요청하면 401 오류가 반환될 것이다.
- 403 (Forbidden) : 서버가 요청을 이해했지만, 사용자가 해당 리소스에 접근할 권한이 없음을 나타낸다. 사용자가 인증을 했더라도 허가되지 않은 작업이나 리소스에 대한 접근을 차단할 때 발생한다.
- 서버가 해당 요청을 이해했지만, 권한이 없어 요청이 거부되었음을 의미하는 상태값이다. 즉, 클라이언트가 해당 요청에 대한 권한이 없다고 알려주는 것이다.
- 로그인하여 인증은 받았지만 접근 권한이 없는 정보를 요청하는 경우, 예를 들어 쇼핑몰에 로그인한 후 다른 사용자의 결제 내역을 요청하면 403 오류가 반환될 것입니다.
- 403 오류가 발생했다는 것은 "해당 요청에 대한 자원이 존재함"을 내포하고 있기 때문에 "리소스의 존재 여부"를 알 수 있으므로 이러한 부분은 공격자가 취약점을 찾아내려 할 때 힌트를 제공할 수도 있다.
- 따라서 보안 정책에 따라 권한이 없음을 알리지 않고 자원의 존재 자체를 숨기고 싶다면 404 오류를 사용하는 것이 더 적합할 수 있다. 이렇듯 응답 상태는 상황에 따라 유연하게 적용할 수 있다는 점을 참고하는 것이 좋다.
- 예: 다른 사용자 GitHub 의 비공개 레포지토리에 접근하는 경우에는 403 이 아닌 404 오류를 내려주고 있다.
- 따라서 보안 정책에 따라 권한이 없음을 알리지 않고 자원의 존재 자체를 숨기고 싶다면 404 오류를 사용하는 것이 더 적합할 수 있다. 이렇듯 응답 상태는 상황에 따라 유연하게 적용할 수 있다는 점을 참고하는 것이 좋다.
- 404 (Not Found) : 요청한 리소스를 서버에서 찾을 수 없음을 나타낸다. 웹 사이트의 구조가 변경되거나 URL 이 잘못 입력되어 사용자가 존재하지 않는 페이지에 접근하려고 할 때 발생한다.
- 409 (Conflict) : 리소스의 현재 상태와 충돌이 발생했음을 나타낸다. 사용자가 중복된 데이터를 생성하려 할 때, 이 상태 코드를 반환하여 개발자가 사용자에게 더 명확한 오류 정보를 전달할 수 있다.
- 401 (Unauthorized) : 요청이 인증되지 않았음을 나타낸다. 보안이 중요한 웹 애플리케이션에서 사용자 인증은 필수적이기 때문에, 사용자가 리소스에 접근하기 위해 필요한 권한이 없을 때 발생한다.
- 5xx (서버 오류) : 서버가 요청을 처리하는 도중 오류가 발생했음을 나타낸다.
- 500 (Internal Server Error) : 서버 내부 오류로 인해 요청을 처리할 수 없음을 나타낸다. 서버 측의 문제로 발생하며, 개발자는 이러한 오류를 해결하기 위해 서버 로그를 확인해야 한다.
- 503 (Service Unavailable) : 서버가 일시적으로 요청을 처리할 수 없음을 나타낸다. 서버의 과부하나 유지보수 등 다양한 이유로 발생한다.
HTTPS (HyperText Transfer Protocol Secure)
- HTTP 에 보안 계층을 추가한 프로토콜이다.
- *SSL/TLS 를 사용하여 데이터를 암호화하기 때문에 데이터 유출을 방지할 수 있고, 데이터의 기밀성을 보장한다.
- 기밀성은 데이터를 암호화하여 중간에 탈취되더라도 해독할 수 없도록 한다.
- SSL/TLS 인증서를 사용하여 서버의 신원을 확인하기 때문에 데이터의 무결성과 인증을 보장한다.
- 무결성은 데이터가 전송 중에 변경되지 않도록 보장한다.
- 인증은 서버의 신원을 확인하여 클라이언트가 신뢰할 수 있는 서버와 통신하고 있음을 보장한다.
- 사용자가 방문하는 사이트의 신뢰성을 증가시키는 역할도 한다. 또한, 구글과 같은 검색엔진은 HTTPS 를 사용하는 사이트를 더 신뢰할 수 있는 사이트로 간주하기 때문에 검색 엔진 순위가 향상될 수 있다.
- 인터넷 뱅킹, 전자 상거래, 소셜 네트워크 서비스와 같이 보안이 중요한 웹 애플리케이션에서 사용된다.
SSL(보안 소켓 계층, Secure Sockets Layer)/TLS(전송 계층 보안, Transport Layer Security) 인증서
- 데이터를 암호화하고, 서버와 클라이언트의 인증을 제공하여 안전한 데이터 전송 채널을 구축한다.
- 인증서는 신뢰할 수 있는 인증 기간(Certificate Authority, CA)에서 발급받아야 한다. 서버의 공개키와 서버의 신원을 확인할 수 있는 정보가 포함되어 있다.
HTTPS 연결 과정
- 클라이언트가 서버에 암호화에 필요한 정보들을 보내고, 인증서를 요구한다.
- 클라이언트와 서버 간에 SSL/TLS *핸드셰이크가 이루어진다. 이 과정에서 서버는 자신의 공개키가 포함된 인증서를 클라이언트에게 전송한다.
- 핸드셰이크 : 두 장치가 안전한 통신을 위해 서로의 신원을 확인하고 조건을 정하는 준비 과정
- 클라이언트는 서버의 인증서를 검증한 후, *세션 키를 생성하여 이를 서버의 공개키로 암호화한 뒤 서버에게 전송한다. 이 세션 키는 이후 통신에서 사용될 대칭키 암호화에 활용된다.
- 세션키 : 하나의 통신 세션에서 모든 메시지를 암호화하는 데 사용되는 일회용 대칭 키
- 서버는 자신의 개인키를 사용하여 세션 키를 복호화하고, 이후의 통신은 이 세션 키를 사용하여 암호화된다. 이렇게 함으로써 클라이언트와 서버 간의 안전한 통신 채널이 구축된다. 이제부터 애플리케이션 계층의 프로토콜(HTTP)로 송수신한다.
HTTPS 보안성 강화 방법
- 강력한 암호화 알고리즘과 긴 키 길이를 사용하여 암호화된 데이터를 해독하기 어렵게 만든다.
- 서버의 SSL/TLS 인증서를 정기적으로 갱신하고, 인증서 체인을 올바르게 구성해야 한다. 이는 인증서의 유효성을 보장하고 중간자 공격을 방지한다.
- HSTS(HTTP Strict Transport Security)를 구현하여 클라이언트가 항상 HTTPS 를 통해서만 사이트에 접근하도록 강제한다. 이는 HTTP 를 통한 접근을 차단하여 보안을 강화한다.
- 취약점을 주기적으로 검사하고 보안패치를 적용한다. 이는 알려진 보안 취약점을 제거하여 공격자가 이를 이용하는 것을 방지한다.
'안드로이드 > etc.' 카테고리의 다른 글
[Kotlin] 에러(Error)와 예외(Exception) (0) | 2024.11.20 |
---|---|
[CS] 대칭키와 비대칭키(공개키) 암호화 방식 (0) | 2024.09.11 |
[CS] Database 인덱스 (Index) (0) | 2024.09.09 |