Skip to content

Commit 81491dd

Browse files
authored
chore(getcloser): enhance security config with environment variables and validation
* chore(getcloser): enhance security config with environment variables and validation * chore(ci): add SECRET_KEY and ENVIRONMENT to getcloser deployment workflow
1 parent 443de1a commit 81491dd

3 files changed

Lines changed: 27 additions & 1 deletion

File tree

.github/workflows/deploy-getcloser.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ jobs:
4747
echo "TEAM_SIZE=${{ vars.TEAM_SIZE}}" >> .env
4848
echo "PENDING_TIMEOUT_MINUTES=${{ vars.PENDING_TIMEOUT_MINUTES}}" >> .env
4949
echo "DATA_DIR_HOST=${{ vars.DATA_DIR_HOST }}" >> .env
50+
echo "SECRET_KEY=${{ secrets.SECRET_KEY }}" >> .env
51+
echo "ENVIRONMENT=prod" >> .env
5052
5153
- name: 🚀 Deploy to PROD
5254
run: |

getcloser/backend/.env.example

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# DATABASE_URL=postgresql+psycopg2://user:password@db:5432/app_db
2+
3+
# 보안을 위해 무작위 문자열을 생성하여 설정하세요.
4+
# 예: openssl rand -hex 32
5+
SECRET_KEY=your-super-secret-key-here
6+
7+
# ACCESS_TOKEN_EXPIRE_MINUTES=60

getcloser/backend/app/core/config.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,29 @@
11
import os
2+
from pydantic import field_validator
23
from pydantic_settings import BaseSettings
34

45
class Settings(BaseSettings):
6+
ENVIRONMENT: str = os.getenv("ENVIRONMENT", "dev")
57
DATABASE_URL: str = os.getenv("DATABASE_URL", "postgresql+psycopg2://user:password@db:5432/app_db")
8+
69
"""
710
JWT 안쓸 것 같아 일단 주석 처리하고 추후 확정 시 삭제
811
"""
9-
SECRET_KEY: str = os.getenv("SECRET_KEY", "change-me-in-prod")
12+
# Secret key for JWT signing. Must be overridden in production using environment variables.
13+
DEFAULT_SECRET_KEY = "default-secret-key-change-it"
14+
SECRET_KEY: str = os.getenv("SECRET_KEY", DEFAULT_SECRET_KEY)
15+
16+
@field_validator("SECRET_KEY")
17+
@classmethod
18+
def check_secret_key(cls, v, info):
19+
"""
20+
Validate that SECRET_KEY is not using the default placeholder value in production.
21+
"""
22+
env = os.getenv("ENVIRONMENT", "dev").lower()
23+
if env in ["prod", "production"] and v == cls.DEFAULT_SECRET_KEY:
24+
raise ValueError("SECRET_KEY must be a unique, non-default value in production environments.")
25+
return v
26+
1027
ALGORITHM: str = "HS256"
1128
ACCESS_TOKEN_EXPIRE_MINUTES: int = int(os.getenv("ACCESS_TOKEN_EXPIRE_MINUTES", "60"))
1229

0 commit comments

Comments
 (0)