버튼으로 두뇌 부패 이겨내기

ko생성일: 2025. 6. 23.갱신일: 2025. 7. 8.

버튼 하나로 소셜 미디어 등 유해 인터넷 컨텐츠의 접근을 제한하고, 일정 시간 동안만 허용하는 스마트한 방법을 소개합니다.

프롤로그

인터넷은 내 삶의 골칫거리다. 광고, 산만함, 스폰서 콘텐츠, 나쁜 소식, 나쁜 아이디어, 또 광고, 소셜 미디어, (비)소셜 미디어, 그리고 또 광고.

하지만 나는 소프트웨어 개발자여서 인터넷은 사실상 필수불가결한 존재다. 내 수입의 한 축이기도 하고, 친구, 가족, 사랑하는 사람들, 동료, 스포츠 동호회 사람들, 그리고 전/현 적(敵)들과 대화하기에 좋은 도구이기도 하다. 더불어 우리 회사도 광고를 집행하니, 어떻게 보면 광고가 내 의식주에 직접적으로 도움을 주는 셈이다. 그래서 지금 내 입장은 인터넷에 대해 대체로 중립적이나, 앞으로도 계속 그럴지는 모르겠다.

하지만 인터넷의 부정적인 측면, 특히 중독처럼 나를 사로잡는 소셜 미디어 같은 것들은 줄이거나 조절해볼 수는 있다. 네트워크 광고 차단기로 소셜 미디어를 완전히 차단해봤지만, 내 안의 원시인이 휴대폰의 와이파이를 꺼버려 결국 데이터 요금제로 무한 스크롤을 하게 만들었다. 게다가 아내도 일이나 연구(그리고 물론 은밀한 사적 용도)로 소셜 미디어가 필요하다. 그런데 우리 부부 모두 절제가 잘 안 된다. 완전 차단은 비현실적이고, 그렇다고 "성인 둘에게 무조건적으로 인터넷을 허용한다"는 것도 답이 아니다.

즉, 이 문제는 수학적으로 풀 수 없는 문제처럼 느껴졌다.

그러나 오늘, Neil Chen이 해커 뉴스에 단순하면서도 천재적인 아이디어를 올리면서 기회가 찾아왔다. Neil은 스마트 플러그를 이용해 ublock Origin의 필터링 리스트를 다이나믹하게 제어함으로써, 원하는 때에만 유해 콘텐츠 접근을 허용하는 방법을 소개했지만, 내 상황에서는 직접 적용하기엔 불편했다. 그래서 여기서 나만의 방식으로 각색해본다.

빌딩 블록

나는 이미 gli.net 라우터에서 "Adguard Home"이라는 네트워크 전체 광고 차단기를 쓰고 있다. 그리고 인터넷 없이 동작하는 스마트홈(프롤로그 참조) 용으로는 Home Assistant를 사용 중이다.

즉, 내게는 다음이 있다:

  • Adguard Home이 탑재된 gli.net 라우터
  • Home Assistant
  • 다량의 Zigbee 스위치
  • 약간의 여유 시간

이것들을 적절히 엮을 방법이 분명 있을 것이다.

플랜

Neil처럼, 나도 소셜 미디어 접근을 일정 시간(15분)만 허용하는 버튼을 만들고 싶다. 그 이후에는 쿨다운(1시간)이 끝날 때까지 다시 버튼을 누를 수 없다. 즉, 버튼을 누르면 15분 동안만 필터가 해제된다. Zigbee 지원 스마트 플러그가 여기에 안성맞춤이다.

Image 1

Adguard Home을 gli.net 라우터에 셋업하기

Adguard Home은 gli.net의 OpenWRT 커스텀 버전에 아주 손쉽게 통합되어 있다. 우선, 차단 대상 서비스를 "사용자 지정 규칙"으로 설정해야 한다. 기본 내장 서비스는 "사용자 지정"으로 분류되지 않아 필터 ON/OFF에 쓸 수 없다.

Image 2

Adguard Home API 접근

Adguard Home은 OpenAPI yaml을 통해 강력한 API를 제공한다. 로그인은 일반 사용자의 계정/비밀번호로 하지만, 라우터 기본 UI에서는 인증을 우회하기 때문에 Adguard Home 자체에는 계정 정보가 없다. 해당 포럼 링크에서 별도의 계정/비밀번호를 추가하는 방법이 설명된다. /etc/Adguard/config.yaml 파일을 직접 수정해서 다음과 같이 바꾼다:

users: []

users:
  - name: admin
    password: $2a$10$dXh72ZnexWPjxzRumXX2fOU2gwvPzqM8OZmcWZmFYl1WEiyhOMj2u

이렇게 바꾼다. 암호는 admin의 bcrypt 해시지만, 실제 사용할 때는 자신의 비밀번호를 cyberchef 등으로 해시해 넣으면 된다. cyberchef 해시 생성기를 참고하라.

Home Assistant 연동

Home Assistant는 약간 기능이 축소된 공식 연동 기능을 제공하지만, 본 프로젝트에 필요한 핵심 기능은 충분히 제공한다.

Image 3

여기서 생성되는 "Filtering" 스위치가 사용자 지정 필터를 ON/OFF 해준다. 이 스위치는 자동화(automation)으로 제어할 수 있다.

Image 4

Home Assistant 자동화

여러 시행착오 끝에 지금은 잘 작동하는 아래 자동화 스크립트가 완성되었다.

Image 5


alias: AdGuard Temporary Disable
description: Temporarily disable AdGuard filtering for 15 minutes when button is pressed
triggers:
  - type: turned_on
    device_id: 83c5ac94282a1e46dfb6b98a103dd9f8
    entity_id: 8fbcd8fb42be878036a203950084b125
    domain: switch
    trigger: device
actions:
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ cooldown_ok }}"
          - condition: template
            value_template: "{{ override_inactive }}"
        sequence:
          - data: {}
            target:
              entity_id: input_boolean.adguard_override_active
            action: input_boolean.turn_on
          - data:
              datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
            target:
              entity_id: input_datetime.last_adguard_disable
            action: input_datetime.set_datetime
          - data: {}
            target:
              entity_id: switch.adguard_home_filterung
            action: switch.turn_off
          - delay:
              hours: 0
              minutes: 14
              seconds: 0
              milliseconds: 0
          - repeat:
              count: 15
              sequence:
                - data: {}
                  target:
                    entity_id: switch.steckdose_nous_zigbee_internetblock
                  action: switch.turn_off
                - delay:
                    hours: 0
                    minutes: 0
                    seconds: 2
                    milliseconds: 0
                - data: {}
                  target:
                    entity_id: switch.steckdose_nous_zigbee_internetblock
                  action: switch.turn_on
                - delay:
                    hours: 0
                    minutes: 0
                    seconds: 2
                    milliseconds: 0
          - data: {}
            target:
              entity_id: switch.adguard_home_filterung
            action: switch.turn_on
          - data: {}
            target:
              entity_id: switch.steckdose_nous_zigbee_internetblock
            action: switch.turn_off
          - data: {}
            target:
              entity_id: input_boolean.adguard_override_active
            action: input_boolean.turn_off
    default:
      - delay:
          hours: 0
          minutes: 0
          seconds: 2
          milliseconds: 0
      - data: {}
        target:
          entity_id: switch.steckdose_nous_zigbee_internetblock
        action: switch.turn_off
mode: single
variables:
  cooldown_ok: >-
    {% set last_disable = states('input_datetime.last_adguard_disable') %} {% if
    last_disable != 'unavailable' and last_disable != 'unknown' %}
      {% set hours_since = (now().timestamp() - as_timestamp(last_disable)) / 3600 %}
      {{ hours_since > 1 }}
    {% else %}
      {{ true }}
    {% endif %}
  override_inactive: "{{ is_state('input_boolean.adguard_override_active', 'off') }}"

후기

"와이파이만 꺼버리면 마음대로 소셜 미디어 한다면 이게 무슨 소용인가?"

맞는 말이다. 하지만 이 장치는 내 절제력을 기르고, 독이 되는 것도 소량이면 약이 될 수 있다는 교훈을 일상에 적용하는 데 도움이 된다.