REST와 RESTful API
- REST는 HTTP 프로토콜을 기반으로 리소스를 정의하고 조작하는 아키텍처 스타일
- RESTful은 이 REST의 원칙을 준수하여 설계된 시스템을 의미
예를 들어, 웹 시스템에서 아래와 같이 API를 디자인할 수 있습니다.
- REST(원칙)로 설계한 기본 아이디어:
- 리소스를 URI로 표현하고, 각 작업을 HTTP 메서드로 구분한다.
- RESTful API 구현:
- GET /products → 모든 상품 조회
- POST /products → 새 상품 추가
- DELETE /products/{productId} → 특정 상품 삭제
따라서 REST는 리소스와 메서드의 원칙을 제공하는 개념이고, RESTful은 이를 준수하려고 설계된 구현 방식이라고 이해할 수 있습니다.
URL, URI, URN
- URI: 리소스를 식별하는 모든 문자열의 포괄적 개념 (URL + URN)
- URL: URI의 한 종류로, 리소스의 위치를 지정하는 식별자(보통 우리가 생각하는 웹 주소)
- URN: URI의 또 다른 종류로, 리소스를 고유한 이름으로 식별. 위치나 경로 상관 없이 리소스 그 자체를 유일하게 식별하기 위해 사용
XSS(Cross-Site-Scripting)
XSS 공격은 악의적인 스크립트를 삽입하여 피해자의 브라우저에서 실행시키는 방식으로 민감한 정보를 탈취할 수 있습니다. 방어 방법으로는 데이터 이스케이프, CSP 설정, HttpOnly 속성 설정, 입력 검증 등이 있으며, 이를 통해 스크립트가 실행되지 않도록 하여 XSS 공격을 방어할 수 있습니다.
- 데이터 이스케이프 처리
- 스크립트 실행 가능성이 있는 특수 문자를 이스케이프 처리하여 안전한 문자 엔티티로 변환
- CSP(컨텐츠 보안 정책) 설정
- 신뢰할 수 있는 출처에서만 스크립트를 로드하도록 제한
- HttpOnly쿠키 설정
- 쿠키를 오직 HTTP 요청과 응답을 통해서만 접근할 수 있도록 제한
- 입력 검증과 정규식 필터링
- 특정 HTML 태그나 JavaScript가 포함된 입력을 필터링하여 허용하지 않도록 설정합니다.
CSRF(Cross-Site-Request-Forgery)
CSRF는 사용자가 모르게 악의적인 요청을 서버로 보내는 공격으로, CSRF 토큰, Referer 검증, SameSite 쿠키 설정 등을 통해 방어할 수 있습니다.
CSRF 방어
- CSRF 토큰 사용
- 요청의 Referer 헤더 검증
- 요청이 신뢰할 수 있는 출처에서 온 것인지 확인하는 방법
- 쿠키에 SameSite 속성 설정
- 사이트 간 요청에서 브라우저가 쿠키를 자동으로 전송하지 않도록 할 수 있다.
CSRF 공격은 사용자가 로그인된 상태에서 공격자의 의도대로 위조된 요청을 보내게 만드는 공격입니다. 사용자는 공격 페이지에 접속했을 뿐이지만, 서버는 사용자가 세션을 통해 합법적으로 요청을 보낸 것으로 간주하여 악의적인 작업을 수행하게 됩니다.
CSRF와 XSS의 공격 대상은?
- XSS는 클라이언트 측을 대상으로 하는 공격. 공격 스크립트가 사용자의 브라우저에서 실행
- CSRF는 서버 측을 대상으로 하는 공격
SQL Injection
SQL Injection은 공격자가 악의적인 SQL 코드를 웹 애플리케이션의 입력 필드에 삽입하여, 데이터베이스에서 의도하지 않은 작업을 수행하게 만드는 공격입니다. 이를 통해 공격자는 데이터베이스에서 민감한 정보를 탈취하거나, 데이터를 조작할 수 있습니다.
SQL Injection을 방어하기 위해서는 다음과 같은 방법을 사용할 수 있습니다:
- Prepared Statement(준비된 문) 사용
- Prepared Statement를 사용하면 입력된 데이터는 SQL 쿼리와 분리되어 처리되므로, 입력된 값이 SQL 코드로 실행되지 않고 데이터로 취급됩니다. 이를 통해 SQL Injection을 효과적으로 방어할 수 있습니다.
String query = "SELECT * FROM users WHERE username = ? AND password = ?"; PreparedStatement stmt = connection.prepareStatement(query); stmt.setString(1, username); stmt.setString(2, password); ResultSet rs = stmt.executeQuery();
- ORM(Object-Relational Mapping) 사용
- ORM 프레임워크(예: Hibernate, JPA)를 사용하면 쿼리를 자동으로 생성해주기 때문에, 직접 SQL을 작성하지 않고도 데이터베이스와 안전하게 상호작용할 수 있습니다. ORM은 내부적으로 Prepared Statement를 사용하므로 SQL Injection에 강합니다.
- 입력 데이터 검증 및 필터링
- 사용자가 입력한 데이터가 예상한 형식인지 검증하고, 허용되지 않는 특수 문자를 필터링하여 SQL 구문으로 해석되는 것을 방지합니다. 예를 들어, 사용자 ID 입력에는 숫자만 허용하도록 할 수 있습니다.
- 최소 권한 원칙 적용
- 애플리케이션에서 데이터베이스 접근 권한을 최소화하여, 특정 계정에 읽기 전용 권한만 부여하는 등 권한 관리를 통해 공격 피해를 줄일 수 있습니다.
요약하자면, SQL Injection은 입력된 데이터를 통해 SQL 쿼리를 조작하여 데이터베이스에서 민감한 정보를 탈취하는 공격으로, 이를 방어하기 위해 Prepared Statement 사용, 입력 데이터 검증, 최소 권한 적용 등의 방법을 사용할 수 있습니다.
'외부활동 > JSCODE 네트워크' 카테고리의 다른 글
[4주차] UDP (0) | 2024.11.17 |
---|---|
RESTful하게 개발한다는 건 뭘까? (0) | 2024.11.16 |
[3주차] 쿠키, 세션, 토큰, CORS (0) | 2024.11.15 |
[2주차] DNS (0) | 2024.11.08 |
[2주차] HTTPS (0) | 2024.11.08 |