3. HMAC을 이용한 데이터 검증

HMAC(Hash-based Message Authentication Code)는 요청 메시지의 무결성과 인증을 보장하기 위해 사용하는 암화화 기술이다. 즉 유효한 클라이언트가 생성해서 보냈고 메시지가 위변조되지 않았다는 걸 확인하기 위한 수단이다.

 

HMAC은 해시 함수와 비밀키를 이용해 다음 2가지를 보장한다.

  • 메시지 무결성 : 메시지가 중간에 위변조되지 않았음
  • 인증 : 메시지 발신자를 인증할 수 있음(발신자만 비밀 키 접근)
    • 메시지의 발신자와 수신자는 둘만 알고 있는 비밀 키를 공유하고 이는 외부에 노출되면 안 된다.

 

  • 메시지 발신자는 메시지를 비밀 키로 해싱해서 생성한 MAC(메시지 인증 코드)를 원본 메시지와 함께 수신자에게 전송한다.
  • 수신자는 수신한 메시지와 비밀 키를 이용해 MAC을 다시 생성한 뒤, 발신자가 보낸 MAC과 비교한다.
  • 두 값이 같으면 메시지가 변경되지 않았음을 보장할 수 있고, 다르다면 메시지는 유효하지 않음을 확인할 수 있다.

 

  • 장점
    • 단순하다
    • 효율적이다
    • 낮은 비용으로 인증 보안 구현이 가능하다
    • 사용하는 해시 알고리즘에 따라 보안성이 향상된다
  • 단점
    • 비밀키를 공유하기에 비밀키 외부유출시 보안에 취약해진다
    • 유출 위험이 있어 비밀키 교체가 까다로울 수 있다

 

예시) HMAC 코드 구현

public static class HMAC {
    private String secretKey;
    public HMAC(String secretKey) {
        this.secretKey = secretKey;
    }
    
    public String hmac(String message) {
        try {
            Mac mac = Mac.getInstance("HmacSHA256");
            SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
            mac.init(secretKeySpec);
            byte[] hash = mac.doFinal(message.getBytes("UTF-8"));
            return Base64.getEncoder().encodeToString(hash);
        } catch (Exception e) {
           throw new RuntimeException(e);
       }
   }
}

비교적 간단한 코드로 HMAC 구현이 가능하다는 걸 확인할 수 있다.

 

4. 방화벽으로 필요한 트래픽만 허용하기

서버가 외부에 노출되기 시작하면 포트 스캔부터 다양한 공격이 들어오기에 이를 위한 대응으로 필요한 만큼만 네트워크 접근을 허용하고 나머지는 차단해야 한다. 가장 기본적인 네트워크 접근 차단은 방화벽(firewall)을 통해 이루어진다. 방화벽은 물리적인 장비로 존재하기도 하고, 가상 방화벽(예 : AWS의 보안그룹)으로 존재하기도 한다.

 

방화벽은 네트워크 통신을 두 방향으로 제어한다.

  • 인바운드 트래픽 : 외부에서 내부로 유입되는 것
    • 인바운드는 필수 트래픽만 허용하고 나머지는 차단할 것을 권장
    • 특정 서버 IP의 443포트만 허용하고 나머지는 차단하는 식으로 외부 노출을 최소화
    • 접속을 허용할 클라이언트 IP도 가능한 최소 범위로 지정
  • 아웃바운드 트래픽 : 내부에서 외부로 유출되는 것
    • 가능하면 필수만 허용하고 나머지는 차단. 정해진 목적지로의 트래픽만 허용해야한다.
    • 아웃바운드를 모두 허용할 시 서버가 해킹당했을 때 해커의 중간 경유지로 악용될 수 있기 때문

 

예시) 서비스 특성에 따른 인바운드 트래픽 허용

  • 서비스 API : 외부의 모든 IP에서 서버A IP에 443 포트로 접근 가능
  • 관리자 API : 사내 IP만 서버 B IP의 443 포트로 접근 가능

 

이 외에 방화벽은 단순히 트래픽을 제어하는 것 외에도 DDoS나 포트 스캔 같은 네트워크 공격을 차단하는 기능도 제공한다.

 

  • DDos
    • Distributed Denial of Service, 분산 서비스 공격
    • 여러 위치에서 동시에 다량의 트래픽을 서버에 보내 서버를 느리게 만들거나 아예 서비스를 중단시키는 공격이다.

 

웹 방화벽(Web Application Firewall)

웹 방화벽을 사용하면 HTTP/HTTPS 수준에서 발생하는 공격도 방어할 수 있다. 웹 방화벽은 SQL 인젝션, XSS(Cross Site Scripting) 같은 웹 기반 위협을 감지하고 차단한다.

 

5. 감사 로그(audit log) 남기기

감사로그는 감사 추적이라고도 불리며, 특정 작업, 절차, 사건 또는 장치에 영향을 주는 활동의 순서를 입증하는 보안 관련 기록이다. 데이터 조회 및 변경 이력, 작업자, 시점 등의 정보를 기록해 활동을 입증하는 증거로 사용된다. 보안이 중요한 시스템에서 사고가 발생했을 때 문제 해결에 큰 도움이 된다. 또한 컴플라이언스나 정책, 보안 감사 등을 대응하기 위해서도 감사 로그가 필요하다.

 

대표적안 감사 로그 기록 대상은 다음과 같다.

  • 사용자 로그인/로그아웃 내역
  • 암호 초기화 등 설정 변경 내역
  • 환자 기록을 조회한 의료진 정보
  • 계약서의 수정 이력

 

6. 데이터 노출 줄이기

서비스 운영자가 고객 이름, 휴대폰 번호, 배송 주소 등 고객 민감정보에 접근할 가능성이 있기에 이를 마스킹, 소수 인원에만 고객 목록 조회 권한 부여, 이상접근 감지 등을 통해 예방할 수 있다.

 

마스킹

정보의 일부를 마스킹 하는 방법이다. 서버에서 클라이언트로 응담하는 데이터 자체가 마스킹 되어 있어야 한다.

 

소수인원에게만 고객 목록 조회 권한 부여

권한이 없는 개발자가 조회할 수 없게 하는 것도 방법이다.

 

이상 접근 감지 후 접근 차단

자동화에 익숙한 사람이 도구를 사용해 개인정보를 수집하는 걸 예방하기 위한 방법이다. 고객 리스트 조회 실행이 짧은 간격으로 빈번하게 일어나거나 고객 상세정보 조회가 짧은 시간으로 발생한 다면 이를 감지한 후 접근을 차단하는 방법이다.

 

 

7. 비정상 접근 처리

사용자가 평소와 다른 행동 패턴을 보이면 비정상 접근으로 판단하고 사용자에게 해당 내용을 알려주는 서비스가 있다.

 

비정상 접근의 대표적인 예시는 다음과 같다.

  • 평소와 다른 장소에서 로그인함
  • 평소와 다른 기기에서 로그인함
  • 로그인에 여러 차례 실패함
  • 고객정보 조회 API 지속적/반복적 호출
  • 권한이 없는 URL이나 API에 대한 접근 시도

 

위 상황 발생 시 사용자나 시스템이 일시적으로 계정 잠금 등을 통해 예상치 못한 계정 탈취 상황에 대처할 수 있다.

 

8. 시큐어 코딩

보안을 강화하는 방법으로 코딩하는 방법이다.

 

첫 예시는 SQL injection인데, SQL injection 공격은 코드의 취약점을 이용해 SQL 쿼리에 코드를 삽입하는 방식으로 공격하는 해킹 수법이다. 보통 개인 정보 같은 주요 정보를 탈취하거나 조작할 목적으로 시도한다.

 

SQL injection 공격에 대응하기 위해서는 Prepared Statement를 사용하는 것이다. Prepared Statement를 사용하면 값에 포함된 특수 문자(작은 따옴표 등)를 알맞게 변환해서 SQL을 만들어주기 때문에 SQL 인젝션 공격을 피할 수 있다.

 

SQL 인젝션 외에도 서버 프로그램을 개발할 때는 아래 항목을 신경 써서 보안을 강화해야 한다.

  • 입력 값 검증 : 클라이언트가 전송한 값이 올바르다고 가정하지 말고 모든 값을 검증해야 한다. 검사 항목으로는 필수 여부, 길이 제한, 미허용 값 등이 있다.
  • 개인 정보/민감 정보 암호화 : 인증 정보(로그인 암호, 바이오 정보), 고유 식별 정보(주민 번호, 운전면허 정보)도 암호화 해야 한다.
  • 에러 메시지 시스템에 미노출 : 에러 메시지에 내부 IP나 DB IP 같은 시스템 정보가 노출되지 않도록 한다.
  • 보안 통신 : HTTPS처럼 데이터를 암호화해서 데이터 유출을 방지한다.
  • CORS(Cross Origin Resource Sharing) : 허용된 도메인만 서버 자원에 접근할 수 있도록 제한한다.
  • CSRF(Cross-Site Request Forgery) 대응 : 주요 기능은 타 사이트에서 위조 공격이 들어오는 것을 방지하기 위해 CSRF 토큰, SameSite 쿠키, 캡차 등을 사용한다.

 

9. 개인 보안

개발자가 접근할 수 있는 시스템(다수의 서버, DB)이 많은 만큼 개발자 PC가 해킹 당하면 큰 사고로 이어진다. 그래서 보안 위험에 민감해야 한다. 출처가 불분명한 파일을 다운받거나 의심스러운 이메일의 첨부 파일을 실행하는 행동은 절대 하면 안된다.

 

물리적 보안도 중요하다. 자리를 비울 때는 화면 보호기 실행해 모니터 화면을 아무도 못 보게 잠그고, 중요 사이트에 로그인한 상태에서 화면 잠금을 하지 않은 채로 자리를 비우지도 말아야 한다.

 

보안에는 비용이 따른다.

  • 방화벽, 웹방화벽 -> 장비 구매 혹은 클라우드 서비스 추가가 필요
  • 감사로그 -> 스토리지 필요
  • 비정상 접근 탐지 -> 관련 기능 개발
  • 시스템 접근 권한 관리 -> 접근 제어 솔루션 구매

 

위 방법을 할 수 없는 상황이라면, 최소한의 보안 설정은 하자.

  • 인증/인가
  • 주요 정보 암호화
  • 서버 수준에서 방화벽 설정하기

 

 

 

+ Recent posts