블로그 목록

비트마스크로 여러 권한 플래그를 합치고 포함 여부를 검사하는 방법

각 권한에 1, 2, 4, 8처럼 서로 겹치지 않는 한 비트를 배정하고 OR로 합친 뒤, `(mask & flag) === flag`로 포함 여부를 검사하세요. 권한을 끌 때는 `mask & ~flag`, 토글할 때는 `mask ^ flag`를 쓰되 언어의 정수 폭과 부호 규칙을 먼저 정해야 합니다.

비트마스크는 여러 체크박스 상태를 정수 하나로 표현할 수 있지만 플래그 값이 겹치거나 연산자 우선순위를 놓치면 전혀 다른 권한을 허용할 수 있습니다. 작은 이진수 표를 함께 두면 계산과 검토가 쉬워집니다.

먼저 보는 핵심 요약

  • 독립 플래그는 한 비트만 켜진 2의 거듭제곱으로 정의하고 같은 값을 재사용하지 않습니다.
  • OR는 권한을 합치고 AND는 필요한 비트가 모두 포함됐는지 검사하며 XOR는 현재 상태를 반전합니다.
  • JavaScript의 Number 비트 연산은 32비트 정수로 변환되므로 큰 마스크는 BigInt 또는 다른 구조를 검토합니다.

권한 플래그를 1·2·4·8로 정하는 이유

각 값의 이진 표현에는 하나의 비트만 켜져 있어야 합니다. READ=1(0001), WRITE=2(0010), DELETE=4(0100), ADMIN=8(1000)처럼 배정하면 어떤 조합도 켜진 비트의 위치로 되돌릴 수 있습니다. READ=1과 WRITE=3처럼 여러 비트가 섞인 값을 독립 플래그로 정의하면 포함 검사가 겹칩니다.

OR로 권한을 합치고 AND로 검사하는 식

READ와 WRITE를 합치면 `1 | 2`의 결과인 3(0011)이 됩니다. 특정 플래그가 켜졌는지는 마스크와 플래그를 AND한 결과가 플래그 자체와 같은지 봅니다. 여러 비트를 묶은 요구 조건도 `(mask & required) === required`로 검사하면 필요한 권한이 모두 있는지 확인할 수 있습니다.

해제와 토글에서 NOT·XOR을 구분하는 방법

`mask & ~flag`는 지정 비트를 0으로 만들어 권한을 해제합니다. `mask ^ flag`는 꺼져 있으면 켜고 켜져 있으면 끄므로 UI 토글에는 편하지만 권한을 확실히 제거해야 하는 코드에는 부적합할 수 있습니다. 추가는 `mask | flag`, 제거는 `mask & ~flag`처럼 의도를 고정한 연산을 쓰세요.

JavaScript에서 32비트 범위를 확인해야 하는 이유

ECMAScript의 Number 비트 연산은 피연산자를 32비트 정수 표현으로 바꿔 계산하므로 높은 비트를 쓰면 값이 음수로 보이거나 정보가 잘릴 수 있습니다. 32개를 넘는 독립 상태가 필요하거나 큰 정수를 정확히 다뤄야 한다면 BigInt 비트 연산, Set 또는 별도 권한 테이블이 요구에 더 맞는지 검토하세요.

단계별로 확인하는 방법

  1. 독립 권한 목록 만들기

    각 상태의 의미와 변경 주체를 정리하고 서로 독립인 권한만 개별 플래그로 나눕니다.

  2. 고유 비트 값 배정하기

    1, 2, 4, 8 순서로 한 비트 값만 배정하고 예약·폐기된 비트도 문서에 남깁니다.

  3. 합치기와 포함 검사하기

    OR로 마스크를 만들고 괄호를 사용한 `(mask & flag) === flag` 식으로 테스트합니다.

  4. 경계값과 직렬화 검증하기

    0, 전체 권한, 해제·토글과 최고 비트를 시험하고 DB·JSON 왕복 뒤 값이 유지되는지 확인합니다.

판단 기준을 한눈에 비교하기

확인 항목판단 기준
OR `mask | flag`지정 플래그를 켜며 이미 켜져 있어도 결과가 유지됩니다.
AND `(mask & flag) === flag`지정한 비트가 모두 포함됐는지 검사합니다.
AND NOT `mask & ~flag`다른 비트는 유지하면서 지정 플래그를 확실히 끕니다.
XOR `mask ^ flag`지정 비트의 현재 상태를 반대로 바꾸므로 의도적인 토글에 사용합니다.

실행 전 체크리스트

  • 모든 독립 플래그가 서로 다른 2의 거듭제곱인가요?
  • 포함 검사에 `(mask & flag) === flag` 형태의 괄호를 썼나요?
  • 해제와 토글 연산을 목적에 맞게 구분했나요?
  • 언어·DB·API가 같은 정수 폭과 부호 규칙을 사용하나요?

주의할 점

권한 검사를 클라이언트의 비트마스크 값만 믿고 결정하지 마세요. 서버에서 인증된 사용자와 최신 정책을 기준으로 다시 검사하고, 마스크 정의 변경 시 기존 저장값의 마이그레이션과 감사 로그를 준비해야 합니다.

함께 보면 좋은 글

자주 묻는 질문

플래그 값을 1, 2, 3, 4 순서로 정하면 안 되나요?

3은 이진수 0011로 이미 1과 2의 비트를 함께 포함하므로 독립 플래그가 아닙니다. 개별 상태에는 1, 2, 4, 8처럼 한 비트만 켜진 값을 사용하세요.

권한 하나가 있는지 `mask & flag`만 확인해도 되나요?

단일 비트의 참·거짓 확인에는 쓸 수 있지만 여러 비트가 묶인 flag의 전체 포함 여부에는 부족합니다. 명확하게 `(mask & flag) === flag`를 사용하세요.

XOR로 권한을 제거해도 되나요?

현재 켜져 있다는 보장이 있을 때만 제거 결과가 됩니다. 꺼진 권한에 XOR를 적용하면 오히려 켜지므로 확실한 제거에는 `mask & ~flag`가 적합합니다.

JavaScript에서 33번째 플래그를 Number로 만들 수 있나요?

Number 비트 연산은 32비트 정수로 변환되므로 일반 비트 연산자로 안전하게 독립 플래그를 늘릴 수 없습니다. BigInt나 Set, 권한 테이블 같은 표현을 검토하세요.

근거와 출처

도구에서 직접 확인하기

설명한 기준을 실제 값에 적용하려면 진법 변환·비트 연산 계산기에서 작은 샘플부터 확인하세요. 원본과 결과를 나란히 비교한 뒤 실제 사용 환경에 적용하는 순서가 가장 안전합니다.

이 글은 알파카랩스 Utils개발 도구 도구와 함께 보는 정보성 가이드입니다. 규격과 외부 서비스 정책은 바뀔 수 있으므로 중요한 결정 전에는 연결된 공식 출처의 최신 내용을 다시 확인하세요.

무료 도구 둘러보기