개발/네트워크

[Cryptography] 현대 백엔드 보안의 기둥, AES 암호화 알고리즘 동작 원리와 실무 가이드

Mr.Lee 하루 2026. 6. 9. 00:25

이번에 AES-126, AES-256 이 안맞아서 에러가 나는 경우가 발생해서 정리해 봅니다.

[Cryptography] 현대 백엔드 보안의 기둥, AES 암호화 알고리즘 동작 원리와 실무 가이드

안녕하세요, 백엔드 개발자 여러분! 서비스를 개발하다 보면 사용자 비밀번호 외에도 주민등록번호, 계좌번호, API 키 등 수많은 민감 데이터를 다루게 됩니다. 이때 데이터베이스나 메모리에 평문(Plaintext)으로 값을 저장하는 것은 보안상 매우 위험하죠.

대부분의 실무 환경에서는 이를 방지하기 위해 AES(Advanced Encryption Standard) 알고리즘을 사용합니다. 아마 코드 상에서 AES/CBC/PKCS5Padding 같은 문자열을 기계적으로 복사해 사용해 보신 적이 많으실 텐텐데요. 오늘은 이 암호화 기술이 내부적으로 어떻게 동작하는지 개발자의 시선에서 딥다이브해 보고, 실무 적용 시 주의해야 할 핵심 포인트까지 정밀하게 정리해 보겠습니다.


1. AES(Advanced Encryption Standard)란?

AES는 미국 표준기술연구소(NIST)에서 제정한 대칭키(Symmetric-key) 방식의 블록 암호(Block Cipher) 알고리즘입니다.

  • 대칭키 (Symmetric-key): 데이터 암호화(Encryption)와 복호화(Decryption)에 사용하는 비밀키가 동일합니다. 연산 속도가 비대칭키(RSA 등)에 비해 압도적으로 빠르지만, 통신 양측이 키를 안전하게 공유해야 하는 '키 분배 문제'를 안고 있습니다.
  • 블록 암호 (Block Cipher): 고정된 크기의 데이터 단위를 하나의 블록으로 묶어 암호화를 수행합니다.

💡 DES에서 AES로의 세대 교체 역사

1970년대 표준이었던 DES(Data Encryption Standard)는 컴퓨터 성능의 비약적인 발전으로 인해 56비트에 불과한 키 길이가 무차별 대입 공격(Brute-force attack)에 뚫리는 치명적인 문제를 맞이했습니다. 이를 보완하기 위해 연산을 세 번 반복하는 3DES가 임시 방편으로 쓰였으나 연산 속도가 너무 느렸죠.

이를 해결하기 위해 NIST는 새로운 표준 공모전을 열었고, 벨기에의 암호학자 조안 대먼(Joan Daemen)과 빈센트 라이먼(Vincent Rijmen)이 설계한 레인달(Rijndael) 알고리즘이 최종 채택되어 지금의 AES 표준이 되었습니다.


2. AES 규격과 아키텍처의 핵심 특징

AES는 고도의 가벼움과 안정성을 동시에 확보하기 위해 다음과 같은 엄격한 규격을 가집니다.

① 고정된 블록 크기 (128-bit)

원본 레인달 알고리즘은 가변 블록 크기를 지원했으나, AES 표준에서는 블록 크기가 무조건 128비트(16바이트)로 고정되었습니다. 즉, 아무리 긴 데이터라도 16바이트 단위의 블록들로 쪼개어 연산합니다.

② 가변 키 길이와 라운드(Round) 수

AES는 개발자가 지정하는 비밀키의 길이에 따라 세 가지 버전으로 나뉩니다. 키의 길이가 길어질수록 보안성은 기하급수적으로 올라가지만 내부 반복 연산 횟수인 '라운드(Round)' 수가 증가하여 연산 자원을 더 소모합니다.

알고리즘 종류 비밀키 길이 (Key Size) 내부 라운드 수 (Rounds)
AES-128 128 비트 (16 바이트) 10 라운드
AES-192 192 비트 (24 바이트) 12 라운드
AES-256 256 비트 (32 바이트) 14 라운드

Dev Tip: 성능이 극도로 민감한 모바일/IoT 환경이 아니라면, 현대 백엔드 시스템에서는 가급적 최고 수준의 보안을 제공하는 AES-256을 표준으로 사용하는 것을 권장합니다.

③ SPN(Substitution-Permutation Network) 구조

과거 DES가 데이터를 반으로 쪼개어 교차 연산하던 페이스텔(Feistel) 구조를 썼던 것과 달리, AES는 전체 블록을 하나의 $4 \times 4$ 바이트 행렬 상태(State)로 구성한 뒤 병렬로 연산하는 SPN(치환-치환 네트워크) 구조를 사용합니다. 이 덕분에 CPU 수준에서 병렬 최적화가 가능하여 처리 속도가 매우 빠릅니다.


3. AES 내부 작동 원리: 4단계 라운드 함수

AES 암호화는 입력된 평문 블록([Plaintext Block])에 초기 연산을 적용한 후, 아래의 4가지 수학적 단계(Stage)를 반복하여 수행하면서 최종 암호문 블록([Ciphertext Block])을 생성합니다. (단, 마지막 라운드에서는 3단계인 MixColumns가 생략됩니다.)

  • 단계 1. SubBytes (바이트 치환)
    • S-Box 기반의 비선형 바이트 치환 작업을 통해 데이터의 혼돈성(Confusion)을 확보합니다.
  • 단계 2. ShiftRows (행 이동)
    • 행렬의 행들을 규칙에 따라 왼쪽으로 순환 이동시켜 데이터의 확산성(Diffusion)을 확보합니다.
  • 단계 3. MixColumns (열 혼합)
    • 열 단위로 수학적 혼합 연산을 수행하여 입력값의 작은 변화가 출력값 전체를 바꾸는 산사태 효과를 극대화합니다.
  • 단계 4. AddRoundKey (라운드 키 더하기)
    • 라운드별로 생성된 고유 키와 현재 데이터 블록을 XOR 연산하여 암호화를 최종 완성합니다.

1단계: SubBytes (바이트 치환)

행렬의 각 바이트를 암호학적으로 설계된 고정 대치표인 S-Box(Substitution Box)를 기반으로 1:1 매핑되는 다른 바이트로 교체합니다. 이 과정은 철저히 비선형 변환으로 이루어지며, 공격자가 입력값과 출력값 사이의 선형적 연관성을 찾지 못하게 차단하는 혼돈성(Confusion)을 제공합니다.

2단계: ShiftRows (행 이동)

$4 \times 4$ 행렬의 각 행을 아래 규칙에 따라 왼쪽으로 순환 이동(Shift)시킵니다.

  • 0번째 행: 이동 안 함
  • 1번째 행: 왼쪽으로 1바이트 이동
  • 2번째 행: 왼쪽으로 2바이트 이동
  • 3번째 행: 왼쪽으로 3바이트 이동

3단계: MixColumns (열 혼합)

각 열(Column)에 특수한 행렬 연산(갈루아 필드 $GF(2^8)$ 상의 매트릭스 곱셈)을 적용하여 열 내부의 바이트들을 무작위로 섞어버립니다. 이 단계를 거치면 입력값의 단 1비트만 바뀌어도 출력되는 암호문 전체가 완전히 뒤바뀌는 산사태 효과(Avalanche Effect)가 극대화되어 통계적 추적을 불가능하게 만드는 확산성(Diffusion)을 확보합니다.

4단계: AddRoundKey (라운드 키 더하기)

원본 마스터 비밀키로부터 키 스케줄링(Key Scheduling)을 통해 도출된 해당 라운드의 '라운드 키'를 현재 데이터 행렬과 XOR(배타적 논리합) 연산합니다. XOR 연산의 특성상 동일한 키로 한 번 더 연산하면 데이터가 원상 복구되므로 복호화 시에도 핵심 축으로 사용됩니다.


4. 실무 개발 시 필수 체크리스트: 블록 암호 운용 모드(Mode)

실무에서 대용량 텍스트나 바이너리 파일을 암호화할 때는 16바이트로 쪼개진 블록들을 어떻게 유기적으로 연결하여 연산할지 정의해야 합니다. 이를 운용 모드(Mode of Operation)라고 부르며, 개발자의 모드 선택에 따라 시스템의 보안 등급이 완전히 갈립니다.

❌ ECB (Electronic Codebook) Mode - 절대 사용 금지

  • 특징: 가장 단순한 모드로, 각 블록을 아무런 연결 고리 없이 독립적으로 암호화합니다.
  • 문제점: 평문 블록의 내용이 같으면 출력되는 암호문 블록도 항상 같습니다. 이 때문에 데이터의 전체적인 패턴이나 윤곽(예: 이미지 파일 암호화 시 실루엣이 그대로 노출됨)이 그대로 드러나므로 상용 서비스에서는 절대로 사용해서는 안 됩니다.

⭕ CBC (Cipher Block Chaining) Mode - 가장 보편적인 표준

  • 특징: 이전 블록의 암호화 결과물을 다음 블록의 평문과 XOR 연산한 뒤 암호화를 진행합니다.
  • 초기화 벡터 (IV, Initialization Vector): 첫 번째 블록은 이전 암호문이 없기 때문에 연산을 시작할 기준점이 필요합니다. 이를 위해 사용하는 무작위 바이트 배열이 IV입니다. IV는 암호화할 때마다 반드시 무작위로 새로 생성되어야 하며, 동일한 평문이라도 IV가 다르면 완전히 다른 암호문이 추출되어 안전합니다.
  • 단점: 앞 블록의 암호화가 완료되어야 다음 블록 연산이 가능하므로 병렬 처리(Parallelism)가 불가능하여 대용량 처리 시 속도 제한이 있을 수 있습니다.

⭕ GCM (Galois/Counter Mode) Mode - 최신 고성능 권장 표준

  • 특징: 카운터(Counter) 값을 기반으로 스트림 암호화를 진행하면서, 동시에 데이터의 무결성을 검증할 수 있는 인증 태그(Tag)를 생성하는 AEAD(Authenticated Encryption with Associated Data) 방식입니다.
  • 장점: 데이터 암호화(기밀성)뿐만 아니라, 누군가 중간에 암호문을 위변조했는지 여부(무결성)를 코드 수준에서 완벽히 검증할 수 있습니다. 또한 각 블록이 독립적인 카운터 값을 가지므로 하드웨어 레벨에서 병렬 연산이 가능해 속도가 매우 빠릅니다. 현대 웹 표준 프로토콜(TLS 1.3)이나 최신 시스템 아키텍처에서 가장 권장하는 모드입니다.

5. 결론 및 요약

백엔드 엔지니어로서 안전한 시스템을 구축하기 위해 오늘 다룬 AES의 핵심 내용을 세 줄로 요약해 보겠습니다.

  1. AES는 강력한 수학적 변환(SPN 구조)을 거치는 128비트 블록 단위의 표준 대칭키 암호화 알고리즘이다.
  2. 실무에서 키 길이를 선택할 수 있다면 보안성이 가장 우수한 AES-256 방식을 우선적으로 고려한다.
  3. 데이터 패턴 노출 위험이 있는 ECB 모드는 절대 지양하고, 비즈니스 요구사항과 성능에 따라 CBC(with 무작위 IV) 혹은 무결성 검증이 포함된 GCM 모드를 채택한다.

보안은 사후 약방문보다 설계 단계에서 올바른 알고리즘과 운용 모드를 선택하는 것이 훨씬 비용이 적게 든다는 점을 기억해 주세요. 오늘 정리한 내용을 바탕으로 현재 운영 중인 서비스의 암호화 로직을 다시 한번 점검해 보시는 건 어떨까요?

궁금한 점이나 인프라 환경별 구현 이슈가 있다면 언제든 댓글로 의견 공유해 주세요! 감사합니다.