01 - 2025년 OWASP 상위 10대: 개발자 가이드
우리가 작성하는 모든 코드 줄에는 데이터 보호라는 암묵적인 책임이 따릅니다. 그리고 사용자 신뢰. 2025년에는 애플리케이션과 아키텍처가 점점 복잡해지면서 분산되고 자동 코드 생성 도구의 채택이 증가하고 있습니다. 보안은 더 이상 나중에 생각할 수 없습니다. 거기 2025년 OWASP 상위 10위 나타냅니다 웹 애플리케이션의 가장 심각한 10가지 취약점에 대한 업데이트된 참조 자료입니다. 개발자는 그것을 철저히 알아야합니다.
이 가이드는 특히 다음 사항에 중점을 두고 새 목록의 10개 범주를 모두 분석합니다. 2025년에 두 가지 새로운 카테고리가 도입되었습니다.: 소프트웨어 공급망 장애(A03) e 예외적 조건의 잘못된 처리(A10). 각 취약점에 대한 명확한 설명을 찾을 수 있습니다. 취약하고 안전한 코드 TypeScript/Node.js 및 특정 모범 사례 각도용.
무엇을 배울 것인가
- OWASP 2025 카테고리 10개(신규 카테고리 2개 포함)
- 2021년 버전과 비교한 주요 차이점
- 취약코드 및 관련 대책 예시
- npm 종속성 공급망을 보호하는 방법
- AI 생성 코드의 45%가 보안 테스트에 실패하는 이유
- 애플리케이션 보안을 위한 Angular 관련 체크리스트
OWASP란 무엇이며 Top 10은 어떻게 탄생했나요?
La OWASP(오픈 월드와이드 애플리케이션 보안 프로젝트) 그리고 재단 글로벌 수준의 소프트웨어 보안 향상을 목표로 2001년에 설립된 비영리 단체입니다. 글로벌. 그의 가장 잘 알려진 프로젝트는 OWASP 상위 10위: 문서 웹 애플리케이션의 가장 심각한 10가지 취약점을 나열하는 참조가 업데이트되었습니다. 수백 개의 조직에서 수집된 실제 데이터를 주기적으로 기반으로 합니다.
이 목록은 수백만 개의 애플리케이션과 수십만 개의 애플리케이션을 분석하여 작성되었습니다. 취약성. 프로세스는 결합 경험적 데이터 (실제 사고, 보고 보안, 자동화된 분석) 커뮤니티 설문조사 수집하는 것 새로운 위협에 대한 보안 전문가의 우려. 각 카테고리 지도 하나 이상 CWE(공통 약점 열거)또는 표준 분류 소프트웨어 약점.
이전 버전
OWASP Top 10에는 2004년, 2007년, 2010년, 2013년, 2017년, 2021년, 현재 2025년 등 여러 버전이 있습니다. 각 업데이트는 위협의 진화를 반영합니다. 2017년에는 주사가 1위를 차지했습니다. 장소; 2021년에는 Broken Access Control이 이를 능가했습니다. 2025년에는 변화가 보인다 even more significant, with the entry of two completely new categories that reflect 소프트웨어 개발의 현대적인 과제.
OWASP Top 10 2025의 새로운 내용
2025년판은 2021년과 비교하여 중요한 변화를 가져왔습니다. 다음은 전체 목록입니다. 위치 변경:
| 위치 | OWASP 2025 | 2021년부터 변경 |
|---|---|---|
| A01 | 손상된 액세스 제어 | #1에서 확인되었습니다(A01:2021). 이제 SSRF가 포함됩니다. |
| A02 | 보안 구성 오류 | 5위에서 2위로 올라갑니다. |
| A03 | 소프트웨어 공급망 실패 | 신규 - A06:2021 확장(취약한 구성요소) |
| A04 | 암호화 실패 | 2위에서 4위로 떨어졌네요 |
| A05 | 주입 | 3위에서 5위로 하락 |
| A06 | 안전하지 않은 디자인 | 4위에서 6위로 떨어졌습니다. |
| A07 | 인증 실패 | #7에서 확인됨 |
| A08 | 소프트웨어 또는 데이터 무결성 오류 | #8에서 확인됨 |
| A09 | 보안 로깅 및 경고 오류 | #9에서 확인됨(이름 변경: "모니터링" 대신 "경고") |
| A10 | 예외적인 조건의 잘못된 처리 | 신규 - SSRF 대체(현재 A01에 통합됨) |
두 가지 주요 변경 사항
A03: 소프트웨어 공급망 실패 - 공급망에 대한 공격 최근 몇 년 동안 소프트웨어가 폭발적으로 증가했습니다. 이 카테고리가 투표로 선정되었습니다. OWASP 커뮤니티 설문조사에서 가장 큰 관심사입니다. 타이포스쿼팅을 다루고, 종속성 혼란, 악성 패킷, 손상된 CI/CD 파이프라인 등이 있습니다.
A10: 예외적인 조건의 잘못된 처리 - 잘못된 관리 오류 및 예외가 발생했으며 이제 자율 공격 벡터로 인식됩니다. 포함 24 부적절한 오류 처리, 페일오픈, 민감한 정보 유출과 관련된 CWE 오류 메시지를 통해.
A01:2025 - 액세스 제어가 손상됨
Il 손상된 액세스 제어 4년 연속 1위 자리를 굳건히 지켰다. 연속. 사용자가 리소스에 액세스하거나 작업을 수행할 수 있을 때 발생 그에게는 권한이 없습니다. 가장 일반적인 형태는 다음과 같습니다. IDOR (안전하지 않은 직접 객체 참조), 경로 순회, 제어 바이패스 역할, 토큰 또는 URL 매개변수 조작.
2025년에는 이 카테고리에 SSRF를 통합 (서버측 요청 위조), 2021년 버전에서는 A10 위치를 차지했습니다. 논리는 SSRF가 기본적으로 액세스 제어 실패: 서버가 다음을 요청합니다. 도달해서는 안 되는 자원.
예: IDOR(안전하지 않은 직접 객체 참조)
// VULNERABILE: nessun controllo di ownership
app.get('/api/users/:id/profile', async (req, res) => {
// Chiunque può vedere il profilo di qualsiasi utente cambiando l'ID
const user = await User.findById(req.params.id);
res.json(user);
});
// SICURO: verifica ownership + ruolo
app.get('/api/users/:id/profile', authenticate, async (req, res) => {
if (req.user.id !== req.params.id && req.user.role !== 'admin') {
return res.status(403).json({ error: 'Accesso non autorizzato' });
}
const user = await User.findById(req.params.id);
if (!user) {
return res.status(404).json({ error: 'Utente non trovato' });
}
res.json(user);
});
예: 경로 순회
import path from 'path';
// VULNERABILE: l'utente controlla il percorso del file
app.get('/api/files/:filename', (req, res) => {
// Un attaccante può richiedere: ../../../etc/passwd
res.sendFile(`/uploads/${req.params.filename}`);
});
// SICURO: normalizza e valida il percorso
const UPLOAD_DIR = '/var/www/uploads';
app.get('/api/files/:filename', authenticate, (req, res) => {
const filename = path.basename(req.params.filename);
const filePath = path.join(UPLOAD_DIR, filename);
// Verifica che il percorso risolto sia dentro UPLOAD_DIR
if (!filePath.startsWith(UPLOAD_DIR)) {
return res.status(400).json({ error: 'Percorso non valido' });
}
res.sendFile(filePath);
});
손상된 액세스 제어에 대한 각도 방어
- 구현하다 루트 가드 (
canActivate,canMatch) 예약된 경로를 보호하기 위해 - 사용 HTTP 인터셉터 각 요청에 JWT 토큰을 자동으로 첨부합니다.
- 권한에 따라 UI 요소를 숨기지만 서버 측에서는 항상 유효합니다.
- 백엔드 측을 확인하지 않고 localStorage에 역할이나 권한을 삽입하지 마십시오.
- 인증 로직을 하나로 중앙 집중화 인증 서비스 재사용 가능
A02:2025 - 잘못된 보안 구성
Le 보안 구성 오류 2025년에는 5위에서 2위로 상승합니다. 이러한 도약은 실제 사실을 반영합니다. 구성이 점점 더 복잡해짐에 따라 (클라우드, 컨테이너, 마이크로서비스, CDN), 구성 오류가 하나가 되었습니다. 침해의 가장 빈번한 원인 중 하나입니다.
이 카테고리에는 변경되지 않은 기본 구성, 보안 HTTP 헤더가 포함됩니다. 누락, CORS가 너무 허용적, 프로덕션에 스택 추적이 노출됨, 포트 및 서비스가 없음 필요한 기능은 노출되고 디버그 기능은 활성화된 상태로 유지됩니다.
보안 헤더 및 CORS
import helmet from 'helmet';
import cors from 'cors';
const app = express();
// Header di sicurezza con Helmet
app.use(helmet({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'"],
styleSrc: ["'self'", "https://fonts.googleapis.com"],
imgSrc: ["'self'", "data:", "https:"],
fontSrc: ["'self'", "https://fonts.gstatic.com"],
connectSrc: ["'self'", "https://api.tuodominio.com"],
frameAncestors: ["'none'"], // Protegge da clickjacking
objectSrc: ["'none'"],
}
},
referrerPolicy: { policy: 'strict-origin-when-cross-origin' },
hsts: { maxAge: 31536000, includeSubDomains: true, preload: true },
}));
// CORS restrittivo
app.use(cors({
origin: ['https://tuodominio.com'],
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization'],
credentials: true,
maxAge: 86400 // Cache preflight per 24 ore
}));
일반적인 구성 오류
Access-Control-Allow-Origin: *생산 중- 오류 응답에 전체 스택 추적 표시
- 기본 자격 증명은 변경되지 않습니다(admin/admin)
- 프로덕션에 노출되는 디버그 포트(Node.js의 경우 9229)
- 파일
.env공개적으로 접근 가능 - 웹 서버에서 활성화된 디렉토리 목록
A03:2025 - 소프트웨어 공급망 오류(신규)
이는 OWASP Top 10 2025의 가장 중요한 새로운 기능 중 하나입니다. 소프트웨어 공급망 실패 이전 A06:2021(취약함)을 확장합니다. 및 오래된 구성요소)를 포함하여 종속성뿐만 아니라 훨씬 더 넓은 범위를 포괄합니다. 취약하지만 전체 소프트웨어 빌드, 배포 및 업데이트 생태계가 취약합니다.
2025년에는 이 카테고리가 가장 높은 평균 발생률(5.19%)을 기록했습니다. 테스트할 때 모든 카테고리에 걸쳐. 가장 큰 관심사로 꼽히기도 했습니다 OWASP 커뮤니티 설문 조사에서 보안 전문가가 고려하는 것으로 보고됨 공급망 공격은 가장 빠르게 증가하는 위협입니다.
공급망에 대한 공격 유형
소프트웨어 공급망 공격은 다양한 형태로 나타납니다. 다양한 특성과 정교함 수준:
- 타이포스쿼팅: 인기 있는 라이브러리와 유사한 이름을 가진 악성 패키지(예:
lodahs대신에lodash,expres대신에express) - 의존성 혼란: 합법적인 패키지 대신 내부 패키지와 동일한 이름을 가진 공개 패키지가 설치됩니다.
- 계정 탈취: 합법적인 패키지에 악성 코드를 삽입하기 위해 관리자 계정을 손상시키는 행위
- 파이프라인 중독 구축: 빌드 프로세스 중에 CI/CD 파이프라인에 악성 코드 주입
- 슬롭스쿼팅: AI가 발명한 종속성 이름(환각)을 공격 대상으로 이용하는 패키지
실제 사고: 2025년 9월
2025년 9월, 피싱 캠페인으로 인해 npm 관리자 계정이 손상되었습니다. 수십억 건의 다운로드가 포함된 최소 27개의 패키지가 손상되었습니다. 매주. Shai-Hulud라는 자가 복제 웜이 500개 이상의 패키지를 감염시켰습니다. 무력화되기 전에. 이번 사건은 보호가 얼마나 중요한지 보여줍니다. 공급망의.
공급망에 대한 실질적인 방어
# 1. Usa npm ci (non npm install) per rispettare il lockfile
npm ci
# 2. Audit delle vulnerabilità in CI/CD
npm audit --audit-level=high
# 3. Verifica le firme dei pacchetti (npm 9+)
npm audit signatures
# 4. Blocca i registry non autorizzati in .npmrc
registry=https://registry.npmjs.org/
@mycompany:registry=https://npm.mycompany.com/
# 5. Genera e verifica SBOM (Software Bill of Materials)
npx @cyclonedx/cyclonedx-npm --output-file sbom.json
// package.json - usa versioni esatte, non range
{
"dependencies": {
"express": "4.21.2",
"helmet": "8.0.0",
"cors": "2.8.5"
},
"overrides": {
"vulnerable-transitive-dep": "2.1.0"
}
}
Angular 프로젝트에 대한 공급망 체크리스트
- 달리다
npm audit차단 임계값이 있는 모든 CI/CD 파이프라인에서 - 미국 디펜다봇 o 새롭게 하다 자동 업데이트를 위해
- 활성화 2FA 모든 관리자 npm 계정에서
- 패키지를 설치하기 전에 패키지의 소스를 확인하세요(
npm info) - 생성 SBOM 각 릴리스에 대해 전용 도구를 사용하여 모니터링
- 미국
npm ci(아니다npm install) 모든 자동화된 환경에서 - 하나 구성 허용 목록 승인된 레지스트리 중
.npmrc
A04-A07: 확인된 카테고리 개요
A04:2025 - 암호화 실패
#2에서 #4로 떨어졌지만 여전히 심각한 취약점으로 남아 있습니다. 이는 부적절한 보호에 관한 것입니다. 민감한 데이터: 일반 텍스트 또는 약한 해시(MD5, SHA1)로 저장된 비밀번호, 암호화 키 소스 코드에 하드코딩되어 있고, HTTPS가 없는 데이터 전송, 오래된 암호화 알고리즘 등이 있습니다.
import bcrypt from 'bcrypt';
import crypto from 'crypto';
// VULNERABILE: MD5 non e sicuro per le password
const insecureHash = crypto.createHash('md5').update(password).digest('hex');
// SICURO: bcrypt con salt rounds adeguato
const SALT_ROUNDS = 12;
const secureHash = await bcrypt.hash(password, SALT_ROUNDS);
// SICURO: verifica password senza timing attack
const isValid = await bcrypt.compare(inputPassword, storedHash);
A05:2025 - 주입
주입이 #3에서 #5로 떨어졌습니다. 이는 대책(ORM, 매개변수화된 쿼리, 소독제)가 널리 보급되었습니다. However, they remain dangerous. SQL 주입, NoSQL 포함 주입, 명령 주입, LDAP 주입 및 XSS.
// VULNERABILE: concatenazione diretta
const query = `SELECT * FROM users WHERE email = '${userInput}'`;
// Input malevolo: ' OR '1'='1' --
// SICURO: query parametrizzate (PostgreSQL)
const result = await pool.query(
'SELECT * FROM users WHERE email = $1',
[userInput]
);
// SICURO: ORM con sanitizzazione automatica (TypeORM)
const user = await userRepository.findOneBy({
email: userInput // TypeORM sanitizza automaticamente
});
A06:2025 - 안전하지 않은 디자인
이는 결함에 관한 것입니다. 설계 구현이 아닌 애플리케이션의. 위협 모델링의 부재, 최소 권한 원칙 준수 실패, 속도 제한과 같은 제어의 생략은 모두 안전하지 않은 설계의 예입니다. 는 주요 차이점: 안전한 디자인에는 구현 버그가 있을 수 있지만 안전하지 않은 디자인은 더 나은 코드만으로는 고칠 수 없습니다.
A07:2025 - 인증 실패
인증 실패에는 다음이 포함됩니다. 취약한 비밀번호 수락, 만료되지 않음, 만료되지 않거나 비밀이 약한 JWT 토큰, 다단계 없음 인증. 주요 방어 수단은 만료 시간이 짧은 JWT, 새로 고침 토큰을 구현하는 것입니다. 안전하고 엄격한 자격 증명 검증.
A08-A09: 무결성 및 모니터링
A08:2025 - 소프트웨어 또는 데이터 무결성 오류
이 카테고리는 신뢰를 유지하고 무결성을 확인하는 데 중점을 둡니다. Supply보다 더 세부적인 수준의 소프트웨어, 코드 및 아티팩트 체인(A03). 포함 사항: 무결성 검사가 없는 CI/CD 파이프라인, 무결성 검사가 없는 자동 업데이트 서명 유효성 검사, 신뢰할 수 없는 데이터의 역직렬화, 외부 리소스에 대한 SRI(하위 리소스 무결성).
<!-- VULNERABILE: script esterno senza verifica -->
<script src="https://cdn.example.com/lib.js"></script>
<!-- SICURO: SRI verifica l'integrita del file -->
<script
src="https://cdn.example.com/lib.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/ux..."
crossorigin="anonymous">
</script>
A09:2025 - 보안 로깅 및 경고 실패
2025년에는 "Monitoring" 대신 "Alerting"을 추가하여 이름을 변경했습니다. 이벤트를 기록하는 것뿐만 아니라 생성하는 것의 중요성 활성 경고 이상이 발생했을 때. 구조화된 로깅 및 경고가 없으면 침해가 계속 발생할 수 있습니다. 몇 달 동안 감지되지 않았습니다.
import winston from 'winston';
const securityLogger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
defaultMeta: { service: 'auth-service' },
transports: [
new winston.transports.File({ filename: 'security.log' }),
]
});
// Eventi CRITICI da loggare e per cui generare alert
function logFailedLogin(email: string, ip: string): void {
securityLogger.warn({
event: 'FAILED_LOGIN',
email,
ip,
timestamp: new Date().toISOString(),
alert: true // Flag per il sistema di alerting
});
}
// REGOLA: 5 login falliti dallo stesso IP = alert immediato
// REGOLA: accesso admin da IP sconosciuto = alert immediato
// REGOLA: modifica permessi fuori orario = alert immediato
기록할 내용(및 기록하지 말아야 할 내용)
- 로그: 로그인 성공/실패, 액세스 거부(403), 민감한 데이터 변경, 관리자 작업
- 기록하지 마세요: 비밀번호, 토큰, 신용 카드 번호, 완전한 개인 데이터
- 비정상적인 로그인 패턴, 비정상적인 지리적 위치에서의 액세스, 4xx/5xx 오류 피크에 대한 경고 생성
A10:2025 - 예외적인 조건의 잘못된 처리(신규)
2025년 두 번째 빅뉴스입니다. 이 카테고리에는 24 CWE 오류, 예외 및 변칙적 조건의 부적절한 처리와 관련됩니다. 개념 열쇠와 "페일오픈": 애플리케이션에 오류가 발생한 경우, 차단하는 대신 액세스 권한을 부여하거나 작업을 계속하도록 선택합니다.
누락되거나 불완전한 입력, 환경 상태 등으로 인해 예외적인 조건이 발생할 수 있습니다. 예상치 못한 이벤트(메모리, 네트워크, 권한), 높은 수준의 지연 오류 처리 대신 발생하는 위치와 예외가 전혀 처리되지 않습니다.
이 카테고리의 CWE 키
- CWE-209: 민감한 정보가 포함된 오류 메시지
- CWE-234: 누락된 매개변수 처리 실패
- CWE-274: 부족한 권한에 대한 부적절한 관리
- CWE-476: 널 포인터 역참조
- CWE-636: "Failing Open" - 안전하게 실패하지 마십시오.
예: 인증의 페일오픈
// VULNERABILE: fail-open - in caso di errore l'utente passa
async function verifyToken(req: Request, res: Response, next: NextFunction) {
try {
const token = req.headers.authorization?.split(' ')[1];
const decoded = jwt.verify(token!, process.env.JWT_SECRET!);
req.user = decoded;
next();
} catch (error) {
// ERRORE CRITICO: in caso di eccezione, si prosegue comunque!
console.log('Token verification failed, continuing...');
next(); // L'utente non autenticato accede alle risorse protette
}
}
// SICURO: fail-closed - in caso di errore l'accesso e negato
async function verifyToken(req: Request, res: Response, next: NextFunction) {
try {
const token = req.headers.authorization?.split(' ')[1];
if (!token) {
return res.status(401).json({ error: 'Token mancante' });
}
const decoded = jwt.verify(token, process.env.JWT_SECRET!);
req.user = decoded;
next();
} catch (error) {
// CORRETTO: in caso di errore, si blocca l'accesso
return res.status(401).json({ error: 'Autenticazione fallita' });
}
}
예: 오류를 통한 정보 유출
// VULNERABILE: espone dettagli interni del sistema
app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
res.status(500).json({
error: err.message,
stack: err.stack, // Rivela percorsi del file system
query: (err as any).sql, // Rivela struttura del database
config: (err as any).config // Potrebbe rivelare credenziali
});
});
// SICURO: messaggi generici in produzione, dettagli solo in sviluppo
const isProduction = process.env.NODE_ENV === 'production';
app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
// Logga i dettagli internamente
securityLogger.error({
message: err.message,
stack: err.stack,
url: req.originalUrl,
method: req.method,
ip: req.ip
});
// Restituisci solo un messaggio generico al client
res.status(500).json({
error: isProduction
? 'Si e verificato un errore. Riprova più tardi.'
: err.message
});
});
예: 잘못된 관리로 인한 자원 고갈
// VULNERABILE: il file handle non viene rilasciato in caso di errore
async function processUpload(filePath: string): Promise<void> {
const handle = await fs.open(filePath, 'r');
const data = await handle.readFile(); // Se fallisce, il handle resta aperto
await processData(data);
await handle.close();
}
// SICURO: pattern try/finally per garantire il rilascio delle risorse
async function processUpload(filePath: string): Promise<void> {
let handle: fs.FileHandle | null = null;
try {
handle = await fs.open(filePath, 'r');
const data = await handle.readFile();
await processData(data);
} catch (error) {
securityLogger.error({ event: 'UPLOAD_FAILED', filePath, error });
throw new AppError('Elaborazione file fallita', 500);
} finally {
if (handle) {
await handle.close(); // Sempre eseguito, anche in caso di errore
}
}
}
기본 원칙: 페일클로즈
보안 상황에서 예외가 발생할 때마다 시스템은 다음을 수행해야 합니다. 기본적으로 액세스 거부 (페일클로즈), 절대로 허가하지 마십시오(페일오픈). 이는 인증, 권한 부여, 입력 유효성 검사 및 모든 결정에 적용됩니다. 안전에 영향을 미치는 것입니다.
초점: AI 생성 코드의 보안
AI 코딩 도구(Copilot, ChatGPT, Claude, Cursor)의 대대적인 도입으로 새로운 위험이 등장합니다: 자동으로 생성된 코드의 보안. 에 따르면 Veracode의 GenAI 코드 보안 보고서 2025, 코드를 분석한 사람 80개 실제 작업에 대해 100개 이상의 LLM이 제작한 결과는 걱정스럽습니다.
AI 보안의 수
- 45% AI 생성 코드 샘플이 보안 테스트에 실패하고 OWASP 상위 10개 취약점을 소개합니다.
- 72% AI 생성 Java 코드의 실패율
- 38-45% Python, C# 및 JavaScript의 실패율
- 86% Cross-Site Scripting(CWE-80)의 특정 실패율
- 88% 로그 삽입에 대한 특정 실패율(CWE-117)
문제가 개선되지 않음
AI 모델은 보안과 관련하여 약 절반의 시간 동안 잘못된 선택을 합니다. 이는 더 큰 모델에서는 개선되지 않습니다. 문제는 전신의: 모델은 종종 동일한 취약점을 포함하는 공개 코드로 훈련됩니다. 피해야 할 것입니다. AI 생성 코드에는 항상 보안 검토가 필요합니다. 인간.
AI 생성 코드에 대한 보안 체크리스트
- AI가 생성한 코드 없이는 절대 받아들이지 마세요. 보안 코드 검토
- 데이터베이스 쿼리가 다음과 같은지 확인하세요. 매개변수화된 (연결 없음)
- 사용자 입력이 다음과 같은지 확인하세요. 검증 및 위생 처리 모든 지점에서
- 비밀이 아닌지 확인하세요. 하드코딩된 생성된 코드에서
- 오류 처리를 확인하세요. 페일클로즈, 페일오픈 아님
- 권한 및 승인 확인: AI는 종종 액세스 제어 없이 코드를 생성합니다.
- 달리다 SAST (정적 애플리케이션 보안 테스트) 모든 AI 생성 코드 자동화
Angular별 보안 체크리스트
Angular는 다양한 내장 보안 기능을 제공하지만 이를 아는 것이 중요합니다. 실수로 비활성화하지 마십시오. 다음은 Angular 애플리케이션과 관련된 체크리스트입니다.
통합 XSS 보호
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
// Angular sanitizza automaticamente il binding nel template
// Le doppie graffe eseguono l'escape dell'HTML automaticamente
// PERICOLOSO: bypassare il sanitizer
@Component({
template: `<div [innerHTML]="trustedHtml"></div>`
})
export class UnsafeComponent {
trustedHtml: SafeHtml;
constructor(private sanitizer: DomSanitizer) {
// SOLO se il contenuto e completamente fidato e sotto il tuo controllo
this.trustedHtml = this.sanitizer.bypassSecurityTrustHtml(content);
}
}
// SICURO: lasciare che Angular sanitizzi automaticamente
@Component({
template: `<div [textContent]="userContent"></div>`
})
export class SafeComponent {
userContent = ''; // Angular esegue l'escape automaticamente
}
HttpClient 및 보안 인터셉터
import { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';
import { inject } from '@angular/core';
import { Router } from '@angular/router';
import { catchError, throwError } from 'rxjs';
export const authInterceptor: HttpInterceptorFn = (req, next) => {
const router = inject(Router);
const token = getStoredToken(); // Da un servizio sicuro
// Aggiungi il token solo alle richieste verso la tua API
const secureReq = req.url.startsWith('/api')
? req.clone({
setHeaders: { Authorization: `Bearer ${token}` }
})
: req;
return next(secureReq).pipe(
catchError((error: HttpErrorResponse) => {
if (error.status === 401) {
// Token scaduto o invalido: redirect al login
router.navigate(['/login']);
}
// Non esporre dettagli dell'errore nell'interfaccia
return throwError(() => new Error('Richiesta fallita'));
})
);
};
기능적 API를 사용한 Route Guard
import { CanActivateFn, Router } from '@angular/router';
import { inject } from '@angular/core';
export const authGuard: CanActivateFn = (route, state) => {
const authService = inject(AuthService);
const router = inject(Router);
if (!authService.isAuthenticated()) {
// Redirect al login con URL di ritorno
router.navigate(['/login'], {
queryParams: { returnUrl: state.url }
});
return false;
}
// Verifica ruolo se richiesto dalla rotta
const requiredRole = route.data?.['role'];
if (requiredRole && !authService.hasRole(requiredRole)) {
router.navigate(['/unauthorized']);
return false;
}
return true;
};
Angular의 콘텐츠 보안 정책
Content-Security-Policy:
default-src 'self';
script-src 'self' 'nonce-RANDOM_VALUE';
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
font-src 'self' https://fonts.gstatic.com;
img-src 'self' data: https:;
connect-src 'self' https://api.tuodominio.com;
frame-ancestors 'none';
base-uri 'self';
form-action 'self';
Angular 최종 체크리스트
- 사용하지 마십시오
bypassSecurityTrustHtml사용자 콘텐츠 포함 - 미국
HttpClient토큰 인터셉터 및 중앙 집중식 오류 관리 포함 - 구현하다 기능성 루트 가드 모든 보호된 경로에 대해
- 하나 구성 제한적인 CSP Angular 애플리케이션을 제공하는 서버에서
- JWT 토큰을 저장하지 마십시오.
localStorage: 쿠키를 선호한다HttpOnly - 유효한 항상 서버 측: Angular Guard는 API가 아닌 UI만 보호합니다.
- 깃발을 사용하세요
--subresource-integrityinng buildSRI 해시를 생성하려면 - Angular 업데이트 유지: 모든 버전에는 보안 패치가 포함되어 있습니다.
결론 및 실행 계획
2025 OWASP Top 10은 빠르게 진화하는 위협 환경을 반영합니다. 두 가지 새로운 것 범주, 공급망 실패 및 예외적 조건의 잘못된 처리는 추가되지 않습니다. 학문적: 매일 실제 애플리케이션에 영향을 미치는 구체적인 위협을 나타냅니다. 는 잘못된 보안 구성이 2위로 올라서면서 보안의 복잡성이 확인되었습니다. 현대 인프라는 점점 더 큰 공격 표면을 만들어냅니다.
개발자 행동 계획
안전 자세를 개선하기 위한 실용적인 3단계 경로는 다음과 같습니다. 신청:
- 1주차 - 기초: 모든 API(A01)에 대한 액세스 제어를 구현하고, 헬멧(A02)으로 보안 헤더를 구성하고, 활성화합니다.
npm auditCI/CD 파이프라인(A03) - 2주차 - 데이터 보호: 비밀번호를 bcrypt/argon2로 마이그레이션(A04)하고, 모든 쿼리가 매개변수화되었는지 확인하고(A05), 속도 제한을 구현합니다(A06).
- 3주차 - 모니터링: 경고를 사용하여 구조적 로깅을 구성하고(A09), 모든 catch 블록을 검토하여 페일오픈을 제거하고(A10), 종속성 SBOM을 생성합니다(A03).
시리즈의 다음 기사
향후 기사에서는 실용적인 가이드를 통해 웹 보안의 개별 영역을 더 깊이 탐구할 것입니다. 전체 코드는 다음과 같습니다.
- 제 02조: XSS 및 CSRF - 사이트 간 공격 및 Angular에서 이를 방지하는 방법
- 제 03조: SQL 주입 및 NoSQL 주입 - Node.js 및 MongoDB 심층 분석
- 제 4조: 보안 인증 - JWT, OAuth2 및 세션
웹 애플리케이션 보안은 한 번만 통과해야 하는 체크포인트가 아닙니다. 지속적인 프로세스 각 개발 단계에 통합되어야 하며, 디자인부터 생산까지. 개발자로서 우리는 코드를 작성할 책임이 있습니다. 기본적으로 안전합니다. OWASP 상위 10개 취약점은 최소한의 취약점을 나타냅니다. 알다. The cost of preventing a vulnerability is always lower than the cost of 그 결과를 겪습니다.







