CI/CD Flow: 1. Developer pushes code β triggers pipeline 2. Build stage compiles/packages the app 3. Test stage runs unit, integration, security tests 4. Artifact is stored (Docker image, JAR, etc.) 5. Deploy stage pushes to staging β then production
Container Lifecycle:
- Write Dockerfile β build image (docker build) β push to registry β pull and run as container
OAuth 2.0 Flow (simplified): - App requests authorization β user approves β auth server issues access token β app uses token to call API
| Tool/Concept | Key Command / Value |
|---|---|
docker build |
docker build -t myapp:latest . |
docker run |
docker run -p 8080:80 myapp |
docker push/pull |
Push/pull image to/from registry |
kubectl apply |
kubectl apply -f deployment.yaml |
kubectl get pods |
List running pods |
| HTTP β HTTPS | Port 80 β Port 443 |
| JWT structure | header.payload.signature (Base64 encoded) |
| Environment vars | os.environ.get('SECRET_KEY') (Python) |
| Webhook trigger | HTTP POST sent to CI/CD on code push |
Continuous Delivery β Continuous Deployment β Delivery still requires a manual approval step for production; Deployment is fully automated. Exam questions love to swap these.
SAST needs source code; DAST needs a running app β If a question says "no access to source," the answer is DAST, not SAST.
Containers are NOT fully isolated β They share the host OS kernel. VMs are fully isolated with their own OS. Don't confuse security properties.
OAuth 2.0 is NOT authentication β It's an authorization framework. OIDC is what adds authentication on top. Exam may try to call OAuth 2.0 an "authentication protocol."
Hardcoded secrets = automatic wrong answer β Any option that stores credentials, API keys, or passwords directly in source code is always the incorrect/insecure choice.
Always know the difference between CI, Continuous Delivery, and Continuous Deployment β especially that Delivery still has a manual gate