본문 바로가기
IT/Network

URL 전송 시 Key 및 Subkey 파라미터 개념

by Echinacea 2025. 2. 12.
반응형

 

1. Key 및 Subkey의 정의

🔹 Key

  • 특정한 리소스나 API를 사용할 수 있도록 하는 주요 식별자입니다.
  • API 인증, 데이터 접근 권한 제어 등에 활용됩니다.
  • 예시:
https://api.example.com/data?key=abcdef123456
  • key=abcdef123456: API 접근을 위한 인증 키

 

🔹 Subkey

  • Key의 하위 개념으로, 특정 기능을 제한하거나 세분화할 때 사용됩니다.
  • 특정 사용자 그룹 또는 기능에 대한 접근을 제어하는 용도로 활용됩니다.
  • 예시:
https://api.example.com/data?key=abcdef123456&subkey=xyz987
  • subkey=xyz987: 특정 데이터 또는 기능에 대한 접근 제한 키

 

2. Key / Subkey 사용 예시

const apiUrl = "https://api.example.com/data?key=abcdef123456&subkey=xyz987";

fetch(apiUrl)
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error("Error:", error));

📌 설명

  • key=abcdef123456: API 전체 접근을 위한 키
  • subkey=xyz987: 특정 기능 또는 특정 권한의 데이터를 가져오기 위한 키

 

 

3. 보안 취약점 - 주민등록번호 노출 사례

 

❌ 잘못된 구현 (보안 위험 코드)

다음은 no 파라미터가 특정 값을 포함할 때 주민등록번호가 평문으로 노출되는 보안 취약점을 가진 코드입니다.

const express = require("express");
const app = express();

app.get("/user", (req, res) => {
    const { key, subkey, no } = req.query;
    
    // 간단한 키 인증 (보안 취약)
    if (key !== "secureKey") {
        return res.status(403).json({ error: "Invalid key" });
    }

    // 주민등록번호가 평문으로 노출되는 취약한 코드
    if (no) {
        return res.json({
            name: "홍길동",
            id_number: "990101-1234567" // 🚨 주민등록번호 평문 노출 (보안 문제)
        });
    }

    res.json({ message: "No data available" });
});

app.listen(3000, () => console.log("Server running on port 3000"));

 

4. 보안 강화 방법

보안 취약점해결 방법

Key 노출 방지 API Key는 서버에서 관리하고, 클라이언트에 노출되지 않도록 해야 함
주민등록번호 평문 노출 개인 정보는 반드시 마스킹(990101-1******) 또는 암호화해야 함
인증 강화 API 요청 시 키 외에도 추가적인 인증 절차(OAuth, JWT 등)를 도입
로그 기록 API 요청 로그를 저장하고 비정상적인 요청 감지

✅ 보안 개선 코드 (마스킹 적용)

function maskIdNumber(idNumber) {
    return idNumber.replace(/(\d{6})-(\d{7})/, "$1-*******");
}

app.get("/user", (req, res) => {
    const { key, subkey, no } = req.query;
    
    if (key !== "secureKey") {
        return res.status(403).json({ error: "Invalid key" });
    }

    if (no) {
        return res.json({
            name: "홍길동",
            id_number: maskIdNumber("990101-1234567") // ✅ 마스킹 처리 적용
        });
    }

    res.json({ message: "No data available" });
});

 

5. 결론

  • key는 주로 API 인증 및 접근을 위해 사용되며, subkey는 세부 기능을 제한하는 용도로 활용됩니다.
  • 보안 취약점을 방지하기 위해 개인정보는 평문으로 반환하지 말고, 반드시 마스킹 또는 암호화 처리해야 합니다.
  • API Key를 클라이언트에서 직접 사용하지 않도록 서버에서 보호하는 것이 중요합니다.
반응형

댓글