2.1 인증대상 및 방식

개요

인증(Authentication)은 시스템이나 서비스에 접근하려는 주체(사용자, 다른 시스템 등)가 정말로 자신이 누구인지 증명하는 과정입니다. 적절한 인증 절차 없이 중요 자원이나 기능에 접근을 허용하는 것은 심각한 보안 위협으로 이어질 수 있습니다.

인증은 일반적으로 다음 세 가지 요소 중 하나 이상을 조합하여 사용합니다:

  • 지식 기반 (Something you know): 비밀번호, PIN 등 사용자만 아는 정보
  • 소유 기반 (Something you have): OTP 기기, 스마트 카드, 공인인증서 등 사용자가 소유한 물리적/논리적 객체
  • 생체 기반 (Something you are): 지문, 홍채, 얼굴 인식 등 사용자의 고유한 생체 정보
이 중 두 가지 이상의 요소를 함께 사용하는 것을 다중 인증(MFA, Multi-Factor Authentication)이라고 하며, 보안 강도를 크게 높일 수 있습니다.

이 기준은 인증이 필요한 대상(사용자, 관리자, 외부 시스템 등)을 명확히 식별하고, 각 대상의 중요도와 위험 수준에 맞는 적절한 인증 방식을 선택 및 구현하기 위한 보안 요구사항을 정의합니다.

보안 대책

  • - 인증 대상 식별: 시스템 접근 주체(사용자, 관리자, API 클라이언트, 내부 시스템 등)를 명확히 식별하고, 각 대상별로 인증 요구 수준을 정의합니다.
  • - 적절한 인증 방식 선택: 보호 대상 자원의 중요도, 예상되는 위협 수준 등을 고려하여 인증 방식을 선택합니다. 중요 시스템 접근, 민감 정보 처리 등에는 비밀번호 외에 OTP, 인증서, 생체 인증 등 다중 인증(MFA) 적용을 적극 검토합니다.
  • - 안전한 인증 정보 관리: 비밀번호 등 인증 정보는 평문으로 저장하지 않고, 반드시 솔트(Salt)를 사용한 안전한 해시 함수(예: bcrypt, scrypt, Argon2, PBKDF2)로 암호화하여 저장합니다.
  • - 기본(Default) 계정 및 비밀번호 제거/변경: 시스템 설치 시 제공되는 기본 관리자 계정이나 추측하기 쉬운 비밀번호는 반드시 제거하거나 복잡하고 안전한 비밀번호로 변경합니다.
  • - 전송 구간 암호화: 인증 정보(아이디, 비밀번호 등)는 네트워크 전송 시 반드시 암호화 통신(TLS/SSL)을 사용하여 가로채기(Sniffing) 공격을 방지합니다.
  • - 인증 관련 정보 노출 금지: 에러 메시지 등을 통해 계정 존재 여부, 비밀번호 정책 등 인증 관련 내부 정보를 유추할 수 없도록 처리합니다. (예: "아이디 또는 비밀번호가 잘못되었습니다." 와 같이 모호한 메시지 사용)

코드 예시 (Python - 안전한 비밀번호 해싱/검증)

비밀번호는 평문 저장이 아닌, 솔트를 포함한 강력한 해시 함수를 사용해야 합니다. 아래는 `bcrypt` 라이브러리 사용 예시입니다.

안전한 코드 (비밀번호 해싱):

import bcrypt

# 사용자로부터 입력받은 비밀번호
password = "user_password123" 
password_bytes = password.encode('utf-8')

# 솔트 생성 및 비밀번호 해싱 (bcrypt가 자동으로 솔트 생성 및 포함)
hashed = bcrypt.hashpw(password_bytes, bcrypt.gensalt())

# 해시된 값(솔트 정보 포함)을 DB에 저장
# 예: hashed = b'$2b$12$...' (bytes 타입)
# DB 저장 시에는 hashed.decode('utf-8') 등으로 문자열 변환 필요
print(hashed.decode('utf-8')) 
                        
안전한 코드 (비밀번호 검증):

import bcrypt

# 로그인 시 사용자로부터 입력받은 비밀번호
login_password = "user_password123"
login_password_bytes = login_password.encode('utf-8')

# DB에 저장된 해시된 비밀번호 값 (문자열 -> bytes 변환 필요)
stored_hash_str = "$2b$12$abcdefghijklmnopqrstuv.abcdefghijklmnopqrstuv.abcdefgh" # 예시
stored_hash_bytes = stored_hash_str.encode('utf-8')

# bcrypt.checkpw 함수로 비밀번호 검증 (솔트는 해시값에 포함되어 있음)
if bcrypt.checkpw(login_password_bytes, stored_hash_bytes):
    print("로그인 성공")
else:
    print("비밀번호 불일치")
                        

Java(Spring Security, jBcrypt), C#(BCrypt.Net), JavaScript(Node.js - bcrypt), PHP(password_hash, password_verify) 등 다른 언어에서도 유사한 라이브러리를 사용하여 안전하게 비밀번호를 해싱하고 검증해야 합니다.