틈메이러·2024년 9월 9일

필기

목록 보기
7/16

🍅웹

1. 웹 서비스 구조

World Wide Web

WWW는 인터넷을 통해 접근할 수 있는 상호 연결된 하이퍼텍스트 문서와 멀티미디어 자원의 시스템
1989년 팀 버너스리가 발명했으며, 웹 브라우저를 통해 사용자들이 하이퍼링크를 클릭해 웹페이지 간을 이동할 수 있다


Hypertext

하이퍼텍스트는 다른 문서나 자원으로 연결되는 링크(하이퍼링크)를 포함하는 텍스트를 말한다
사용자는 이 링크를 클릭하여 관련된 문서나 다른 섹션으로 이동할 수 있다


URI(Uniform Resource Identifier)

URI는 인터넷 상의 자원을 식별하기 위해 사용되는 문자열을 가리키는 일반적인 용어
URI는 URL이나 URN일 수 있으며, 자원의 위치나 이름을 지정하는 방식을 제공

예시: https://example.com는 특정 웹 자원의 위치를 지정하는 URI


URN(Uniform Resource Name)

URN은 자원의 이름만을 식별하며, 자원의 실제 위치와는 무관
URN은 자원의 위치에 관계없이 항상 동일하게 유지되는 이름

예시: urn:isbn:0451450523는 특정 책의 ISBN(국제 표준 도서 번호)을 나타내는 URN


URL(Uniform Resource Locator)

URL은 자원의 위치를 정확하게 나타내는 URI의 한 종류
웹페이지나 파일의 위치를 지정해 브라우저에서 해당 자원에 접근할 수 있게 해준다

예시: https://www.google.com은 구글 홈페이지의 URL


URL 구조

프로토콜 (Protocol)
자원에 접근하기 위해 사용하는 통신 규약
예시: https://, http://, ftp://


도메인 (Domain)

서버의 위치를 나타내는 부분으로, 자원의 호스트 이름이나 IP 주소
예시: www.example.com, 192.168.0.1


포트 번호 (Port Number)

서버의 특정 서비스에 접근하기 위한 포트 번호
일반적으로 웹에서는 포트 번호를 생략하면 기본 포트를 사용
예시: https://www.example.com:443 (443은 HTTPS의 기본 포트)


경로 (Path)

서버 내에서 특정 자원의 위치를 나타내는 부분
파일이나 페이지의 위치를 지정
예시: /folder/page.html


쿼리 문자열 (Query String)

서버로 전달되는 추가 정보로, 자원에 대한 세부 사항이나 요청을 포함
?로 시작하며 여러 개의 값을 전달할 수 있다
예시: ?id=123&name=test (id와 name에 해당하는 값 전달)


프래그먼트 (Fragment)

페이지 내에서 특정 위치로 이동하기 위한 앵커(북마크) 역할
# 시작
예시: #section1 (페이지의 특정 섹션으로 이동)



파라미터 메타문자 (Query Parameters and Metacharacters)

쿼리 문자열은 URL의 마지막 부분에서 서버로 데이터를 전달하는 방식으로 사용되며, 일반적으로 다음과 같은 메타문자들이 사용


? (물음표)
쿼리 문자열의 시작을 나타낸다
경로 뒤에 위치하며, 쿼리 파라미터를 추가할 때 사용
예시: https://www.example.com/page?user=abc


& (앤드)
여러 개의 파라미터를 구분할 때 사용
각 파라미터는 key=value 형식으로 전달
예시: https://www.example.com/page?user=abc&age=25


= (등호)
파라미터 이름과 값을 구분
예시: user=abc에서 user는 키, abc는 값


# (샵, 앵커)
URL에서 프래그먼트를 나타낸다
브라우저가 페이지 내의 특정 위치로 이동하게 한다
예시: https://www.example.com/page#section2 (section2 위치로 이동)


기타 메타문자

% (퍼센트 인코딩): URL에서 특수 문자를 인코딩할 때 사용
예를 들어, 공백은 %20으로 인코딩된다
예시: https://www.example.com/search?q=hello%20world (공백이 %20으로 인코딩됨)


2. HTML (Hypertext Markup Language)

HTML은 웹 페이지를 구성하는 언어로, 웹 브라우저가 내용을 구조화하고 표시할 수 있도록 마크업을 통해 문서를 작성

HTML은 텍스트뿐만 아니라 이미지, 링크, 표, 멀티미디어 등을 포함할 수 있으며, 하이퍼텍스트를 통해 다른 웹 페이지로 연결할 수 있는 기능을 제공

HTML 문서는 기본적으로 태그(tag)로 구성되며, 태그는 콘텐츠의 구조와 의미를 정의


태그

HTML 문서의 구조와 형태를 표현하는 명령어

주요 태그


3. HTTP 프로토콜

HTTP (HyperText Transfer Protocol)는 웹에서 클라이언트(보통 브라우저)와 서버 간에 데이터를 주고받기 위한 프로토콜
HTTP는 클라이언트와 서버 간의 요청(Request)응답(Response) 구조로 동작하며, 인터넷에서 웹 페이지, 이미지, 동영상 등의 자원을 전송하는 표준 방식

프로토콜 버전 비교

  1. HTTP/0.9
    특징: 초기 버전으로, 오직 GET 메소드만을 지원하며, 헤더 없이 단순한 HTML 문서만 전송할 수 있었다
    제약: 콘텐츠 형식에 대한 정의가 없고, 다른 데이터 형식을 지원하지 않음
  1. HTTP/1.0 (1996년)
    특징: 처음으로 헤더 필드를 도입하여 클라이언트와 서버 간에 추가적인 정보를 전송할 수 있게 되었으며, 다양한 메소드(GET, POST, HEAD)를 지원
    제약: 요청마다 새로운 TCP 연결을 생성해야 하므로, 성능이 좋지 않다
  1. HTTP/1.1 (1997년)
    특징: 현재 가장 널리 사용되는 버전
    Keep-Alive: 여러 요청을 하나의 연결로 처리할 수 있어 성능이 향상됨
    추가된 메소드: PUT, DELETE 등 추가 메소드 지원
    헤더 압축 및 지연된 전송 등 다양한 최적화 기술
    제약: 여전히 여러 리소스를 요청할 때, 병목 현상(Head of Line Blocking)이 발생할 수 있음
  1. HTTP/2 (2015년)
    특징: 성능 최적화에 집중한 버전으로, 더 빠른 웹 전송을 위해 개선된 기능을 제공
    멀티플렉싱: 하나의 TCP 연결에서 여러 요청을 동시에 처리할 수 있다
    헤더 압축: 중복되는 헤더 데이터를 압축하여 전송량을 줄임
    서버 푸시: 클라이언트가 요청하기 전에 서버가 자원을 미리 전송할 수 있음
    제약: 여전히 TCP 기반으로, 그로 인한 지연 시간 문제가 발생할 수 있음
  1. HTTP/3 (개발 중, 최신)
    특징: 기존의 TCP 대신 QUIC 프로토콜을 사용하여 전송 지연 문제를 해결하고, 더 빠르고 안정적인 연결을 제공
    UDP 기반: QUIC은 빠른 연결 설정과 더 나은 성능을 제공
    연결 손실 복구: 연결이 중단되었을 때 빠르게 복구 가능

HTTP 메소드 (Methods)

GET: 서버에서 데이터를 조회
주로 웹 페이지를 요청할 때 사용

예시: GET /index.html

POST: 서버로 데이터를 전송하여 처리
주로 폼 데이터나 파일 업로드에 사용

예시: POST /submit-form

PUT: 서버의 자원을 생성하거나 업데이트할 때 사용
지정된 위치에 데이터를 저장

예시: PUT /user/123

DELETE: 서버의 자원을 삭제할 때 사용

예시: DELETE /user/123

HEAD: GET과 동일하지만, 서버는 응답 본문을 반환하지 않고 헤더만을 응답
주로 상태 확인에 사용

예시: HEAD /index.html

PATCH: 자원의 일부를 수정할 때 사용

예시: PATCH /user/123

OPTIONS: 서버가 지원하는 메소드를 확인하기 위해 사용

예시: OPTIONS /api


HTTP 상태 코드 (Status Code)

1xx (정보): 요청을 수신했고 계속 처리 중임을 나타냄
100 Continue: 요청을 계속 진행하라는 의미

2xx (성공): 요청이 성공적으로 처리되었음을 나타냄
200 OK: 요청이 성공적으로 처리됨
201 Created: 요청에 따라 자원이 생성됨

3xx (리다이렉션): 클라이언트가 다른 URL로 이동해야 함을 나타냄
301 Moved Permanently: 요청한 자원이 다른 위치로 영구적으로 이동
302 Found: 임시로 다른 URL로 이동

4xx (클라이언트 오류): 클라이언트의 요청에 오류가 있음을 나타냄
400 Bad Request: 잘못된 요청
401 Unauthorized: 인증이 필요함
403 Forbidden: 요청한 자원에 접근 권한이 없음
404 Not Found: 요청한 자원을 찾을 수 없음

5xx (서버 오류): 서버에서 요청을 처리하는 중 오류가 발생했음을 나타냄
500 Internal Server Error: 서버 내부 오류
502 Bad Gateway: 서버가 잘못된 응답을 수신함



쿠키

쿠키는 웹 브라우저가 사용자의 데이터를 저장하고 서버와 주고받는 작은 파일
주로 사용자의 상태를 기억하거나 특정 설정을 유지하는 데 사용


주요 특징

클라이언트 측 저장: 쿠키는 클라이언트(웹 브라우저)에 저장

작은 데이터: 일반적으로 쿠키는 4KB 이하의 데이터를 저장할 수 있다

자동 전송: 클라이언트는 서버에 요청할 때마다 해당 도메인의 쿠키를 자동으로 서버에 전송

만료 시간: 쿠키는 유효 기간을 설정할 수 있다
예를 들어, 세션 쿠키는 브라우저가 닫힐 때 삭제되지만, 영속 쿠키(persistent cookie)는 설정된 만료 시간까지 유지된다

보안 취약성: 쿠키는 클라이언트 측에 저장되기 때문에 보안상 취약할 수 있으며, 민감한 정보를 저장할 때는 반드시 암호화해야 한다

사용 예:
세션 유지: 사용자가 로그인을 하면, 서버는 세션 ID를 생성하고 이를 쿠키에 저장하여 사용자가 페이지를 이동해도 로그인이 유지되도록 한다

사용자 설정 저장: 웹사이트에서 사용자가 선택한 테마, 언어, 레이아웃 등의 설정을 쿠키에 저장하여 사용자가 다시 방문할 때 이 설정을 자동으로 적용할 수 있다


보안 관련 문제와 대응

XSS (Cross-Site Scripting): 쿠키는 클라이언트 측에 저장되므로, 클라이언트가 XSS 공격에 노출될 경우 악성 스크립트가 쿠키에 접근할 수 있다
이를 방지하기 위해 쿠키에 HttpOnly 속성을 설정하면, JavaScript를 통해 쿠키에 접근할 수 없게 된다

CSRF (Cross-Site Request Forgery): 공격자가 피해자의 브라우저를 통해 악의적인 요청을 서버로 보낼 수 있는 공격
이를 방지하기 위해 쿠키에 SameSite 속성을 설정해 외부 사이트에서 쿠키를 사용한 요청을 차단할 수 있다

쿠키 탈취: 쿠키는 네트워크 상에서 전송되므로 중간에 가로채일 수 있다
이를 막기 위해 Secure 속성을 사용하여 HTTPS 연결을 통해서만 쿠키가 전송되도록 설정해야 한다



세션

세션은 서버에서 사용자 정보를 저장하는 방식으로, 클라이언트에는 세션 ID만 전달된다
서버는 세션 ID를 사용해 사용자를 식별하고, 클라이언트의 상태를 유지한다


주요 특징

서버 측 저장: 세션 데이터는 서버에 저장되며, 클라이언트는 세션 ID만 가진다
클라이언트의 요청 시 서버는 이 세션 ID를 사용해 해당 사용자의 데이터를 조회한다

세션 ID 저장 위치: 세션 ID는 일반적으로 클라이언트 측 쿠키에 저장되지만, URL 파라미터로 전달될 수도 있다

짧은 수명: 세션은 서버의 설정에 따라 일정 시간 동안 유효하며, 사용자가 활동을 멈추거나 브라우저를 닫으면 세션이 만료될 수 있다


보안 관련 문제와 대응:

세션 탈취(Session Hijacking): 세션 ID가 탈취되면 공격자가 해당 세션을 가로채서 사용자의 권한으로 서버에 접근할 수 있다
이를 방지하기 위해 세션 ID를 주기적으로 재생성하고, HTTPS를 통해 안전하게 전송해야 한다

세션 고정(Session Fixation): 공격자가 클라이언트에게 미리 정의된 세션 ID를 강제로 할당하여 공격자가 이를 통해 클라이언트 세션을 탈취하는 방식
이를 막기 위해 로그인 시 세션 ID를 재생성해야 하며, 세션의 만료 시간을 적절히 설정해야 한다

서버 메모리 부하: 세션은 서버에 저장되기 때문에, 많은 사용자가 접속할 경우 서버 메모리에 부담이 될 수 있다
이 때문에 분산 서버 환경에서는 세션 클러스터링이나 세션 데이터베이스 등을 사용해 세션을 관리한다



토큰

토큰은 인증 정보를 포함하는 작은 데이터 조각으로, 주로 클라이언트가 서버로부터 인증된 상태를 유지하기 위해 사용
서버는 클라이언트가 보내는 토큰을 검증해 클라이언트의 권한을 확인한다


주요 특징

클라이언트-서버 간 정보 교환: 토큰은 클라이언트가 서버에 인증 요청을 보낼 때 사용
토큰을 통해 사용자의 인증 상태를 유지하거나 권한을 부여

상태 비저장 방식: 토큰 기반 인증은 상태 비저장(stateless) 방식으로, 서버가 세션 정보를 유지하지 않고 토큰만으로 인증을 처리
서버는 각 요청 시 클라이언트가 전달하는 토큰을 검증하여 권한을 확인


보안 관련 문제와 대응

토큰 탈취: 토큰은 클라이언트 측에서 저장되기 때문에, 중간에 탈취될 수 있다
이를 방지하기 위해 HTTPS를 통해 토큰을 안전하게 전송하고, 토큰의 유효 시간을 짧게 설정하는 것이 좋다

재사용 방지: 일회용 토큰을 사용해, 한 번 사용된 토큰은 재사용할 수 없도록 설정하는 것이 안전하다
이를 통해 공격자가 탈취한 토큰을 재사용하는 것을 방지할 수 있다

서명된 토큰: 토큰은 서버가 서명하여 위변조를 방지할 수 있다
클라이언트가 서버에 요청할 때마다 서버는 토큰의 서명을 확인하여 토큰이 변조되지 않았는지 검증한다



JWT (JSON Web Token)

JWT는 JSON 형식으로 데이터를 저장하는 토큰으로, 주로 사용자 인증을 위한 목적으로 사용
JWT는 자체적으로 정보를 담고 있어, 추가적인 데이터베이스 조회 없이도 클라이언트가 누구인지 확인할 수 있다


주요 특징

상태 비저장: JWT는 서버가 별도의 세션 상태를 유지하지 않고도 인증할 수 있는 상태 비저장 방식의 토큰
클라이언트가 JWT를 서버로 보내면, 서버는 JWT 내부의 정보를 사용해 클라이언트를 인증한다

JWT는 세 부분으로 구성된다

헤더(Header): 토큰의 타입과 해싱 알고리즘 정보를 포함한다

페이로드(Payload): 인증에 필요한 클레임(Claim) 정보를 포함
예를 들어, 사용자 ID, 권한, 토큰의 만료 시간 등이 포함

서명(Signature): 헤더와 페이로드를 해시한 값으로, 토큰의 무결성을 확인할 수 있다

자체 정보 포함: JWT는 사용자 정보를 포함하므로, 서버가 별도로 세션 정보를 저장할 필요가 없다
클라이언트가 JWT를 서버에 전송하면, 서버는 이 토큰을 검증하여 클라이언트가 누구인지 식별하고 권한을 부여


보안 관련 문제와 대응

토큰 변조: JWT는 서명을 포함하므로, 변조를 막을 수 있다
클라이언트가 토큰을 변조하더라도 서버는 서명을 검증해 이를 차단할 수 있다

토큰 탈취: JWT가 클라이언트 측에 저장되므로, 탈취되면 공격자가 해당 토큰을 이용해 서버에 접근할 수 있다
이를 방지하기 위해 JWT는 반드시 HTTPS를 통해 전송되어야 하며, Access Token과 Refresh Token을 분리하여 관리해야 한다

만료 시간: JWT는 유효 기간이 있어야 하며, 너무 긴 만료 시간은 보안 위험을 초래할 수 있다
일반적으로 Access Token은 짧은 만료 시간(몇 분 몇 시간)을 가지며, Refresh Token은 더 긴 만료 시간(며칠 몇 주)을 가진다

서명 알고리즘 선택: JWT는 기본적으로 HMAC 또는 RSA를 사용해 서명된다HMAC은 대칭 키 알고리즘이고, RSA는 비대칭 키 알고리즘
보안이 중요한 경우 RSA와 같은 비대칭 키를 사용하는 것이 더 안전하다


4. OWASP TOP 10

OWASP(Open Web Application Security Project) Top 10은 웹 애플리케이션 보안 취약점에 대한 글로벌 표준으로, 보안 전문가들이 웹 애플리케이션에서 자주 발생하는 보안 문제를 이해하고 대응할 수 있도록 도와준다
OWASP Top 10은 주기적으로 갱신되며, 최신 위협 동향에 따라 업데이트된다


CWE (Common Weakness Enumeration)

CWE소프트웨어 보안 취약점의 체계적 분류를 위한 목록으로, 주로 보안 취약점의 근본적인 원인을 설명
이는 주로 소프트웨어 개발자, 보안 전문가들이 소프트웨어에서 발생할 수 있는 취약점을 예방하고 제거하기 위한 표준화된 분류 체계


주요 특징

소프트웨어 취약점의 원인에 초점을 맞추며, 주로 개발 과정에서 발생할 수 있는 설계 및 구현의 결함을 설명

취약점을 일반적인 패턴으로 정의하여, 보안 전문가들이 취약한 소프트웨어를 분석하고 개선할 수 있게 도움

CWE 목록은 MITRE라는 비영리 기관에서 관리하며, 주로 OWASP Top 10이나 SANS Top 25 등 보안 표준에서 사용


사용 목적

개발자들이 소프트웨어 설계 및 개발 시 취약점을 예방할 수 있도록 가이드라인 제공

보안 도구들이 취약점을 식별하고 보고할 때 공통 용어로 사용

조직들이 소프트웨어 보안 평가를 수행할 때 참조할 수 있는 자료 제공


CVE (Common Vulnerabilities and Exposures)

CVE이미 발견된 보안 취약점에 대해 고유한 식별 번호를 부여하여 관리하는 시스템
주로 특정 제품에서 발생하는 취약점에 대한 구체적인 정보와 해당 취약점의 영향, 해결 방법 등을 다룸


주요 특징

각 취약점은 고유한 CVE ID로 식별
예를 들어, "CVE-2024-12345"는 2024년에 발견된 특정 보안 취약점을 가리킨다

CVE는 취약점에 대한 공식적인 보고서 역할을 하며, 주요 보안 벤더와 조직들이 CVE 정보를 참고하여 보안 패치를 개발하고, 시스템을 보호

CVE 목록은 MITRE와 같은 기관에서 관리하며, 다양한 제품과 소프트웨어에서 발견된 취약점을 중앙 집중식으로 관리한다


사용 목적

보안 연구원들이 취약점을 공유하고 문서화할 때 사용

소프트웨어 벤더가 취약점 보고서에 기반하여 보안 패치를 개발하고 배포

보안 관리자들이 취약점 관리 및 패치 적용 여부를 결정할 때 사용

profile
나는야 멋쟁이 토마토

0개의 댓글