특강
5분 기록보드
내 경험을 정리하기 시작할 때 가장 좋은 시점은 지금 당장이고 정리는 5분이면 충분하다.
취업에 있어서 최종 프로젝트의 의미
- 기술적인 역량을 보여주기 위한 방법. 프로젝트에 어떤 고민이 녹아 있는지를 보여준다.
- 소통과 협업 능력을 키우는 기회. 이는 실무에서 매우 중요한 요소이다.
이력서와 면접의 차이
- 이력서: 내가 뭘 했는지 기록한다.
- 면접: 사실 검증 및 무엇을 할 줄 아는지 확인한다.
기록 방법
- 대분류: 7~8가지 중 1개 선택 (예: 기능 구현, 트러블슈팅, 기술적 의사결정, 오류 개선 등).
- 내용: 1~3줄 정도로 간결히 작성하며, 참조 링크, 사진, 커밋 링크 등을 포함.
- 일정 분류: 주차별로 정리.
팁
- 모든 것을 일단 적어보고 시작하라.
- 매일 5분 기록보드 → 매주 멘토링 노트 → 이력서 작성으로 이어진다.
이력서 작성 예시
- 지나치게 길지 않게 요약한다.
- 주변 상황을 묘사하기보다는 핵심 내용을 간결히 전달한다.
모니터링
애플리케이션 개발 후, 안정적이고 효율적인 운영을 위해 모니터링은 필수적이다. 모니터링을 통해 시스템 성능, 가용성, 안정성을 지속적으로 감시하고 문제를 조기에 발견할 수 있다.
모니터링 범위
- 서버: CPU, 메모리, 디스크 사용량 등 서버 자원 사용
- 애플리케이션: 상태, 성능, 로그 등
- 네트워크: 트래픽, 대역폭 사용량, 네트워크 지연 등
- 데이터베이스: 쿼리 성능, 연결 수, 데이터베이스 사용량등
- 보안: 이벤트, 침입 시도, 취약점 등
Actuator
헬스 체크, 메트릭, 환경 정보, 로그 정보 등 애플리케이션의 중요한 정보를 쉽게 확인할 수 있게 해준다.
엔드포인트
application 파일에서 활성화할 수 있다. 보안 위험을 고려해 필요한 엔드포인트와 상세 정보만 노출하는 것을 권장한다. Actuator 엔드포인트의 포트를 따로 지정하거나 Security를 이용해 인가 처리를 할 수 있다.
/actuator/health
: 애플리케이션의 상태 확인/actuator/metrics
: 애플리케이션의 메트릭 정보/actuator/loggers
: 로깅 설정 조회 및 변경/actuator/env
: 환경 변수 및 설정 정보/actuator/beans
: 애플리케이션 컨텍스트의 Bean 확인/actuator/threaddump
: 스레드 덤프 확인/actuator/httptrace
: 최근 HTTP 요청 및 응답 추적
Prometheus
Prometheus는 오픈소스 시스템 모니터링 및 경고 도구이다. 타깃 시스템에서 메트릭 데이터를 수집하고 저장하는 핵심 컴포넌트다.
구성 요소
- 시계열 데이터베이스 (TSDB): 시간에 따라 변화하는 데이터를 저장하는 DB이다.
- Exporter: 메트릭 데이터를 Prometheus가 이해할 수 있는 형식으로 변환한다.
- Pushgateway: 비지속 작업의 메트릭 데이터를 푸시 가능하다.
- Alertmanager: 다양한 방법으로 알림을 관리할 수 있는 도구다.
- Grafana: Prometheus 데이터를 대시보드 형태로 시각화하는 도구이다.
Grafana
Grafana는 다양한 데이터 소스를 시각화하고 분석하는 오픈소스 도구이다.
주요 기능
- 대시보드 구성: 다양한 그래프, 차트, 게이지 등 으로 시각적으로 표현한다.
- 데이터 소스 지원: Prometheus, InfluxDB, Elasticsearch 등 다양한 데이터 소스를 제공한다.
- 알림 설정: 특정 조건에 따라 알림을 보낼 수 있다.
- 플러그인 확장: 다양한 플러그인을 통해 기능 확장이 가능하다.
- 사용자 관리: 접근 권한을 설정하여 보안을 유지한다.
로그 모니터링
Loki
Grafana Labs에서 개발한 로그 집계 시스템이다. Prometheus의 메트릭 수집과 유사하게 로그 데이터를 수집하고, 쿼리할 수 있도록 설계되어있다. 라벨 기반의 메타데이터를 사용하여 로그를 효율적으로 검색할 수 있는 특징이 있다.
보안
CORS
동일 출처 정책(Same-Origin Policy)
보안 매커니즘으로, 웹 브라우저가 스크립트가 로드된 출처와 동일한 출처의 리소스만 접근할 수 있도록 제한한다. 웹 애플리케이션에서는 기본적으로 동일 출처 정책에 따라 동작한다. 출처는 스키마, 호스트, 포트의 조합으로 정의된다.
CORS가 필요한 상황
- SPA와 같이 클라이언트 중심의 웹 애플리케이션은 다른 도메인에서 호스팅되는 API를 호출해야 한다.
- 이미지, 스타일시트, 스크립트, 폰트 등의 리소스는 여러 도메인 간에 공유된다.
Preflight
브라우저가 실제 요청을 보내기 전에 서버에 요청할 권한이 있는지 확인하는 과정이다.
- HTTP 메소드가 단순 요청이 아닐때(GET, HEAD, POST 이외)
- 커스텀 헤더 또는 특정 표준 헤더를 사용할 때
- 특정 Content-Type을 사용할때(
application/json
포함)
CORS 설정시 주의사항
보안적인 측면
- 신뢰할 수 없는 출처를 허용하지 않도록 주의해야 한다.
allowedOrigins
에 와일드카드를 사용하면 모든 출처에서의 요청을 허용하므로 주의해야한다.- 민감한 정보를 보호하기 위해
Access-Control-Allow-Credentials
를 신중하게 설정해야한다.
성능적인 측면
- Preflight 요청이 빈번하면 성능 저하가 발생할 수 있으므로,
Access-Control-Max-Age
를 설정하면 Preflight 요청을 캐싱할 수 있다.
전역으로 CORS 설정하기
@Configuration
public class WebConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true)
.maxAge(3600);
}
};
}
}
컨트롤러 레벨로 CORS 설정하기
@CrossOrigin(origins = "http://localhost:3000")
XSS (Cross-Site Scripting)
XSS는 사용자가 웹 애플리케이션의 취약점을 이용해 악성 스크립트를 실행하는 공격이다.
방어 기법
- 입력 검증 및 인코딩: 사용자 입력을 철저히 검증하고 적절히 인코딩한다.
- CSP(Content Security Policy): 허용된 콘텐츠 소스를 명시한다.
- HTTPOnly 쿠키 사용: JavaScript에서 접근하지 못하도록 설정한다.
SQL Injection
SQL Injection은 사용자 입력을 통해 악의적인 SQL 쿼리를 삽입하여 데이터베이스를 조작하는 공격이다.
방어 기법
- Prepared Statements를 사용하여 쿼리의 파라미터화를 보장한다.
- 최소 권한 원칙을 준수하여 DB 사용자 권한을 제한한다.
그 외 보안 문제들
- Open Redirect
- Directory Traversal
- Clickjacking
- Sensitive Data Exposure
- Insecure Deserialization
- Insufficient Logging & Monitoring