뒤로
Today I Learned #5 (23.05.09)
API PM을 맡으면서 가장 고민했던 부분이 보안이었습니다. API의 특성상 한 번 유출되면 영향도가 크기 때문에 항상 미리 API 보안에 대해 신경써야 되기 때문입니다.
아래는 링크드인(https://www.linkedin.com/posts/husseinbeygi_security-api-restfulapi-activity-7053079537470836736-saWu/)에서 찾은 API 보안 체크리스트를 번역한 내용입니다.
- 인증
- BASIC AUTH를 사용하지 마세요. 대신 표준 인증(JWT 등)을 사용하세요.
- 인증, 토큰 생성, 비밀번호 저장에서 새로운 방법을 개발하지 마세요.
- 표준을 사용하세요.
- 로그인에서 최대 재시도 및 감옥 기능을 사용하세요.
- 모든 민감한 데이터에 대해 암호화를 사용합니다.
- 무작위 복잡한 키(JWT SECRET)를 사용하여 토큰의 무차별 대입 공격을 매우 어렵게 만드세요.
- 헤더에서 알고리즘을 추출하지 마세요. 백엔드에서 알고리즘을 강제하세요(HS256 또는 RS256).
- 토큰 만료(TTL, RTTL)를 가능한 짧게 설정하세요.
- JWT 페이로드에 민감한 데이터를 저장하지 마세요. 이는 쉽게 디코딩될 수 있습니다.
- 너무 많은 데이터를 저장하지 마세요. JWT는 일반적으로 헤더에서 공유되며, 이에는 크기 제한이 있습니다.
- 접근
- DDOS / 무차별 대입 공격을 방지하기 위해 요청을 제한(스로틀링)하세요.
- 서버 측에서 HTTPS를 사용하고 TLS 1.2+ 및 안전한 암호를 사용하여 MITM(중간자 공격)을 방지하세요.
- SSL STRIP 공격을 방지하기 위해 SSL과 함께 HSTS 헤더를 사용하세요.
- 디렉토리 목록을 끄세요.
- 개인 API의 경우, 화이트리스트에 등록된 IP/호스트만 접근을 허용하세요.
- 권한 부여
- 항상 서버 측에서 REDIRECT_URI를 검증하여 화이트리스트에 등록된 URL만 허용하세요.
- 항상 토큰 대신 코드를 교환하려고 시도하세요(응답 유형=토큰 허용 안 함).
- OAUTH 인증 과정에서 CSRF를 방지하기 위해 무작위 해시와 함께 상태 매개변수를 사용하세요.
- 기본 범위를 정의하고, 각 응용 프로그램에 대한 범위 매개변수를 검증하세요.
- 입력
- 작업에 따라 적절한 HTTP 메서드를 사용하세요: GET (읽기), POST (생성), PUT/PATCH (대체/업데이트), DELETE (레코드 삭제), 그리고 요청된 리소스에 대해 요청된 메서드가 적절하지 않은 경우 405 메서드 허용 안 됨으로 응답하세요.
- 요청 수락 헤더(CONTENT NEGOTIATION)의 CONTENT-TYPE를 검증하여 자신이 지원하는 형식만 허용하세요 (예: APPLICATION/XML, APPLICATION/JSON 등). 일치하지 않는 경우 406 허용되지 않는 응답으로 응답하세요.
- 수락하는 POSTED DATA의 CONTENT-TYPE을 검증하세요 (예: APPLICATION/X-WWW-FORM-URLENCODED, MULTIPART/FORM-DATA, APPLICATION/JSON 등).
- 일반적인 취약점 (예: XSS, SQL 인젝션, 원격 코드 실행 등)을 피하기 위해 사용자 입력을 검증하세요.
- URL에 민감한 데이터(자격 증명, 비밀번호, 보안 토큰, API 키)를 사용하지 마세요, 대신 표준 권한 부여 헤더를 사용하세요. 서버 측 암호화만 사용하세요.
- 캐싱, 속도 제한 정책 (예: 할당량, SPIKE ARREST, 또는 동시 속도 제한)을 활성화하고 API 리소스를 동적으로 배포하기 위해 API 게이트웨이 서비스를 사용하세요.
- 출력
- X-CONTENT-TYPE-OPTIONS: NOSNIFF 헤더를 보내세요.
- X-FRAME-OPTIONS: DENY 헤더를 보내세요.
- CONTENT-SECURITY-POLICY: DEFAULT-SRC 'NONE' 헤더를 보내세요.
- 지문 인식 헤더 - X-POWERED-BY, SERVER, X-ASPNET-VERSION 등을 제거하세요.
- 응답에 대한 CONTENT-TYPE을 강제하세요. APPLICATION/JSON을 반환하면, CONTENT-TYPE 응답은 APPLICATION/JSON입니다.
- 자격 증명, 비밀번호, 보안 토큰 같은 민감한 데이터를 반환하지 마세요.
- 완료된 작업에 따라 적절한 상태 코드를 반환하세요 (예: 200 OK, 400 BAD REQUEST, 401 UNAUTHORIZED, 405 METHOD NOT ALLOWED 등).
Today I Learned #5 (23.05.09)
오늘 본 내용 인증 BASIC AUTH를 사용하지 마세요. 대신 표준 인증(JWT 등)을 사용하세요. 인증, 토큰 생성, 비밀번호 저장에서 새로운 방법을 개발하지 마세요. 표준을 사용하세요. 로그인에서 최대 재시도 및 감옥 기능을 사용하세요. 모든 민감한 데이터에 대해 암호화를 사용합니다. 무작위 복잡한 키(JWT SECRET)를 사용하여 토큰의 무차별 대입 공격을 매우 어렵게 만드세요. 헤더에서 알고리즘을 추출하지 마세요. 백엔드에서 알고리즘을 강제하세요(HS256 또는 RS256). 토큰 만료(TTL, RTTL)를 가능한 짧게 설정하세요. JWT 페이로드에 민감한 데이터를 저장하지 마세요. 이는 쉽게 디코딩될 수 있습니다. 너무 많은 데이터를 저장하지 마세요. JWT는 일반적으로 헤더에서 공유되며, ..
https://wikilog.tistory.com/75
1
댓글
로그인 후 댓글을 남길 수 있습니다.
아직 댓글이 없습니다.