MySQL의 시간 표현형식인 DATETIME, TIMESTAMP
두 표현형식에 대해서 알아보자

* 해당 글에서 말하는 local time이란 서버컴퓨터에 설정되어 있는 날짜 기준 시각을 의미

항목 TIMESTAMP DATETIME
용량 4바이트 8바이트
범위 1970-01-01 ~ 2038-01-19 1000-01-01 ~ 9999-12-31
시간대 영향 있음 (타임존 변환 자동 적용) 없음 (그대로 저장)
저장 방식 UNIX timestamp (초 단위) 구조화된 날짜/시간 필드
주의 사항 2038 문제, 시간대 혼동 가능 타임존 변환 로직 수동 구현 필요

TIMESTAMP

  • 저장 용량 : 4Byte
  • 저장 범위 : 1970-01-01 ~ 2038-01-19
  • 시간대 영향 : 서버 Timezone에 따라 변환
  • 내부 저장 방식 : UNIX 시간(초) 기반
  • 주의 사항 : 2038년 문제, timezone 혼동

특징

자동 시간대 관리

저장 : 시간 저장할 때 서버의 timezone → UTC로 변환되어 저장

조회 : 저장된 UTC → 현재 세션/서버의 timezone 기준으로 보여줌

장점

글로벌 서비스에서 사용자 시간대별로 시간 값을 표시할 때, TIMESTAMP는 자동으로 변환되므로 별도의 시간대 계산 로직 없이도 사용자에게 맞는 현지 시간을 보여줄 수 있다.

2038년 문제

TIMESTAMP는 4바이트 날짜 표현 데이터로써 초 단위로 저장하기에, 표현 가능한 범위가 -2147483548 ~ 2147483647이다. 해당 값의 최대값이 2038-01-19 03:14:07 UTC 이기에, 이후 시간 표현에 대해서 문제가 생긴다.

timezone 혼동

  • 서버로 요청하는 클라이언트의 local time이 변경되었을 경우

    • ex) 2025-05-05 10:00:00 → 2025-05-05 01:00:00

    • Asia/Seoul UTC +9* 타임존을 사용하고 있는 서버에서 서버의 TIMEZONE 설정을 UTC로 변경

      ⇒ 기존에 +9시간으로 나오던 시간이 +9가 안된 채로 보여줌

  • 같은 TIMESTAMP 값을 서로 다른 환경에서 비교할 때 오류

    • ex) A 서버 (Asia/Seoul)와 B 서버 (UTC)가 서로 TIMESTAMP 데이터를 주고받는 상황
    • A 서버 : 2025-05-05 12:00:00 UTC +9
    • B 서버 : 2025-05-05 03:00:00 UTC

DATETIME

  • 저장 용량 : 8Byte
  • 저장 범위 : 1000-01-01 ~ 9999-12-31
  • 시간대 영향 : 입력된 값 그대로 저장
  • 내부 저장 방식 : 구조화된 날짜.시간 필드
  • 주의 사항 : UTC 저장이 필요하면 직접 처리해야함

특징

8바이트 구조화된 방식으로 날짜·시간 정보를 별도 필드에 저장하며, 값 변환 없이 그대로 저장된다. 예: 9999-12-31과 같은 값도 안정적으로 표현 가능 (약 47비트 수준이지만 여유 있게 8바이트 확보)

장점

  • 서버 환경, 클라이언트 지역, 타임존 설정과 무관하게 항상 일정한 값 유지
  • TIMESTAMP와 다르게 8바이트의 넓은 범위 저장 가능
  • 타임존에 영향받지 않으며, 타임존 로직은 애플리케이션에서 명시적으로 제어 가능

기준 시간 지정 시 별도의 로직 필요

글로벌 서비스에서 DATETIME을 사용할 경우, 사용자 시간대에 맞게 표시하려면 애플리케이션에서 명시적인 기준 시간(예: UTC) 변환 로직이 필요하다.

반응형

보안설계에서 중요한 키워드 WAF, Zero Trust Network


1. WAF (Web Application Firewall)

정의

웹 애플리케이션 계층(L7)의 보안 방화벽

HTTP 요청/응답을 검사해서 악의적인 공격을 차단하는 역할


WAF가 막아주는 공격 유형:

공격 설명

SQL Injection 쿼리에 악성 코드 삽입 시도
XSS (크로스 사이트 스크립팅) 자바스크립트 삽입 공격
CSRF 인증된 사용자의 권한 도용
경로 탐색(Path Traversal) 파일 시스템 침투 시도
봇 트래픽 차단 스크래퍼, 크롤러, 무차별 대입 공격 차단 등

WAF는 어디에 위치하냐면:

[클라이언트]
   ↓
[WAF] ← 모든 HTTP 요청 검사
   ↓
[웹 서버 / 프록시 서버]
   ↓
[WAS]


WAF 종류

구분 예시

하드웨어 F5 ASM, Imperva
소프트웨어 ModSecurity (Apache/Nginx), NAXSI
클라우드형 AWS WAF, Cloudflare WAF, Azure WAF

2. Zero Trust Network (제로 트러스트 네트워크)

정의

"절대 아무도 신뢰하지 마라.

네트워크 내부든 외부든 모든 요청을 검증하고 최소한의 권한만 허용하라."


핵심 개념:

개념 의미

No implicit trust 내부망이라고 무조건 믿지 않음
모든 요청 인증/인가 사용자, 장치, 앱 단위 인증 필수
최소 권한 원칙 필요한 자원에만 접근 가능
세션 기반 보안 로그인 이후에도 지속적 확인 (MFA, 토큰 검사 등)

Zero Trust 흐름 예시:

[사용자 또는 디바이스 요청]
      ↓
[인증 시스템 (IDP, MFA 등)]
      ↓
[Zero Trust 게이트웨이 (ZTNA Proxy)]
      ↓
[애플리케이션]


구성 요소 예시:

요소 예시

ID 관리 Okta, Azure AD
접근 제어 Zscaler, Cloudflare Zero Trust, Tailscale
정책 엔진 Google BeyondCorp, Istio (서비스메쉬)

WAF vs Zero Trust 비교

항목 WAF Zero Trust

방어 대상 웹 애플리케이션 네트워크 전체 (사용자/디바이스/앱 등)
작동 계층 L7 (HTTP) 전 계층 (ID, 네트워크, 앱, 세션 등)
보안 방식 패턴 매칭, 룰 기반 인증, 정책, 신뢰 검증
목적 공격 차단 (XSS, SQLi 등) 접근 제한 + 인증 기반 통제
설치 위치 웹 서버 앞단 네트워크 게이트웨이, 클라이언트 단 등

한 줄 정리

용어 요약

WAF 웹 공격 막는 L7 보안 필터
Zero Trust "내부망도 믿지 마" 철학으로 모든 요청을 지속적으로 검증
반응형

'공부 > CS' 카테고리의 다른 글

HLS 프로토콜  (1) 2025.06.02
API Gateway  (0) 2025.03.24
워터마크 기술 개념  (0) 2025.03.03
아키텍처 간략 정리  (0) 2025.01.05
언어별 연산 속도  (0) 2024.12.30

volatile은 자바에서 멀티스레딩 환경에서 자주 사용되는 키워드로, 변수에 대한 가시성(visibility)을 보장해 주는 기능


volatile이란?

volatile 키워드는 변수 선언 앞에 붙여서 사용되며, 해당 변수가 여러 스레드에서 동시에 접근될 수 있음을 나타냅니다.


private volatile boolean running = true;

필요한 상황

자바에서 멀티스레딩을 할 때, 각 스레드는 자신만의 캐시에 변수 값을 저장할 수 있음

이때, 한 스레드가 변경한 값이 다른 스레드에 보이도록 캐시 업데이트 진행

예시:

class Example implements Runnable {
    private boolean running = true;

    public void run() {
        while (running) {
            // do something
        }
    }

    public void stop() {
        running = false;
    }
}

이 코드는 stop() 메서드에서 runningfalse로 바꾸더라도, run() 내부의 스레드는 true만 계속 보고 멈추지 않음


private volatile boolean running = true;

volatile의 효과

  1. 가시성 보장 (Visibility)
    • 어떤 스레드가 값을 바꾸면, 다른 모든 스레드는 그 변경을 즉시 볼 수 있습니다.
  2. 원자성은 보장하지 않음 (No Atomicity)
    • volatile읽기/쓰기 자체는 원자적이지만, 복합 연산(++, += 등)은 원자적이지 않아요.
    • 예: count++volatile로도 안전하지 않습니다.

volatile vs synchronized

특징 volatile synchronized
가시성 O O
원자성 X O
성능 빠름 상대적으로 느림 (락 걸림)
용도 단순 플래그, 읽기/쓰기 변수 복잡한 상태 공유, 연산 등

🔸 사용 예시

public class FlagExample {
    private volatile boolean flag = false;

    public void setFlagTrue() {
        flag = true;
    }

    public void waitForFlag() {
        while (!flag) {
            // 대기 중
        }
        System.out.println("Flag detected!");
    }
}

요약

  • volatile은 멀티 스레드 환경에서 변수 값의 변경이 다른 스레드에 보이지 않는 문제(가시성 문제)를 해결하기 위해 사용된다.
  • 일반적으로 CPU는 변수 값을 자신의 캐시에 저장하고 사용하기 때문에, 한 스레드에서 변경한 값이 다른 스레드의 캐시에 반영되지 않아 변경이 전파되지 않는 문제가 발생할 수 있다.
  • volatile 키워드를 사용하면, 변수의 값을 항상 메인 메모리에서 읽고 쓰게 되어 최신 값이 모든 스레드에 보이도록 보장할 수 있다.

  • Thread A는 여전히 true인 줄 알고 계속 루프를 돔
  • Thread B는 메모리에서 false로 바꿨지만, A는 캐시된 값을 사용 중

  • Thread B가 false로 바꾸면
  • Thread A도 즉시 최신 값을 보고 루프 종료
반응형

+ Recent posts