IT AI Data

How to deploy in Streamlit with Unsplash API (Streamlit에서 Unsplash, chatgpt API 사용 보안 관련 문제)

프리위즈 2025. 3. 5. 19:52

1. Cursor로 Code를 생성하면 Unsplash는 이런 코드를 준다.


UNSPLASH_ACCESS_KEY ="키넣어주세요"   

def get_random_image():

 

try:
        # Unsplash API를 사용하여 가로형 무작위 이미지 가져오기
        response = requests.get(
            f"https://api.unsplash.com/photos/random?orientation=landscape&client_id={UNSPLASH_ACCESS_KEY}"
        )
        response.raise_for_status()  # HTTP 오류가 발생하면 예외를 발생시킵니다.
        data = response.json()
       
        # 'urls' 키가 존재하는지 확인
        if 'urls' in data and 'regular' in data['urls']:
            return data['urls']['regular']
        else:
            st.error("이미지를 가져오는 데 실패했습니다. 다시 시도해 주세요.")
            return None
    except requests.exceptions.RequestException as e:
        st.error(f"이미지를 가져오는 중 오류가 발생했습니다: {e}")
        return None

 

 

그래서 Chatgpt에게 어떻게 해결할지 물어봤다. 그리고 완성 된 코드

 

2. 문제는 이 코드가 Streamlit data leak 보안 검토에 계속 해서 걸린다는 것이다.

 # 환경 변수에서 API 키 가져오기
UNSPLASH_ACCESS_KEY = os.getenv("UNSPLASH_ACCESS_KEY")

def get_random_image():
try:
# Unsplash API를 사용하여 가로형 무작위 이미지 가져오기   

headers = {"Authorization": f"Client-ID {UNSPLASH_ACCESS_KEY}"}
    response = requests.get(
        "https://api.unsplash.com/photos/random?orientation=landscape&query=fun",
        headers=headers
    )

    response.raise_for_status()  # HTTP 오류가 발생하면 예외를 발생시킵니다.
    data = response.json()

    # 'urls' 키가 존재하는지 확인
    if 'urls' in data and 'regular' in data['urls']:
        return data['urls']['regular']
    else:
        st.error("이미지를 가져오는 데 실패했습니다. 다시 시도해 주세요.")
        return None
except requests.exceptions.RequestException as e:
    st.error(f"이미지를 가져오는 중 오류가 발생했습니다: {e}")
    return None

https://chatgpt.com/share/67c2ff8d-9bac-8002-bde8-4e19ac5317ca

내가 Steamlit에 배포를 하려니까, unsplash api가 문제가 있어

ChatGPT의 말:

어떤 문제가 발생했는지 좀 더 자세히 말해줄 수 있어?

  • API 키 인증 문제
  • 요청 제한(rate limit)
  • 네트워크 문제
  • 환경 변수 설정 문제

어떤 오류 메시지가 뜨는지 알려주면 더 정확히 도와줄 수 있어!

나의 말:

def get_random_image(): try: # Unsplash API를 사용하여 가로형 무작위 이미지 가져오기 response = requests.get( f"https://api.unsplash.com/photos/random?orientation=landscape&client_id={UNSPLASH_ACCESS_KEY}" ) response.raise_for_status() # HTTP 오류가 발생하면 예외를 발생시킵니다. data = response.json() # 'urls' 키가 존재하는지 확인 if 'urls' in data and 'regular' in data['urls']: return data['urls']['regular'] else: st.error("이미지를 가져오는 데 실패했습니다. 다시 시도해 주세요.") return None except requests.exceptions.RequestException as e: st.error(f"이미지를 가져오는 중 오류가 발생했습니다: {e}") return None

ChatGPT의 말:

코드를 보면, Unsplash API에서 무작위 이미지를 가져오도록 설정되어 있는데, 몇 가지 체크해볼 만한 부분이 있어.

1. 환경 변수(UNSPLASH_ACCESS_KEY) 확인

UNSPLASH_ACCESS_KEY 값이 올바르게 설정되어 있는지 확인해봐.
Streamlit 배포 시 secrets를 사용하면 좋아.

🔹 로컬 환경에서 실행하는 경우

python복사편집import os
UNSPLASH_ACCESS_KEY = os.getenv("UNSPLASH_ACCESS_KEY")

.env 파일이 있다면 dotenv 패키지를 사용해서 로드해야 할 수도 있어.

🔹 Streamlit Cloud에서 실행하는 경우
secrets.toml 파일 또는 st.secrets["UNSPLASH_ACCESS_KEY"] 방식으로 값을 가져와야 해.

python복사편집UNSPLASH_ACCESS_KEY = st.secrets["UNSPLASH_ACCESS_KEY"]

2. API 응답 구조 확인

Unsplash의 random photo API는 무료 계정에서는 요청 제한(rate limit)이 걸릴 수 있어.
코드에서 data['urls']['regular']을 가져오는데, API 응답을 직접 출력해서 구조를 확인해봐.

python복사편집st.write(data)  # API 응답 출력

만약 응답이 예상과 다르면, errors 필드가 있는지도 확인해야 해.


3. 요청 제한 확인 (Rate Limit)

무료 계정은 시간당 50~100개의 요청 제한이 있어. 제한이 걸리면 403 Forbidden 응답이 올 수도 있어.

python복사편집if response.status_code == 403:
    st.error("API 요청 제한이 초과되었습니다. 잠시 후 다시 시도해 주세요.")

🔹 API 호출이 너무 잦다면?

  • 캐싱을 이용해서 불필요한 API 요청을 줄일 수 있어.
  • st.cache_data를 활용해보자.
python복사편집@st.cache_data
def get_random_image():
    # API 호출 코드 (위 코드와 동일)

4. API 호출 시 헤더 추가 (권장사항)

Unsplash에서는 API 호출 시 User-Agent나 Authorization 헤더를 추가하는 것이 좋다고 권장해.

python복사편집headers = {"Authorization": f"Client-ID {UNSPLASH_ACCESS_KEY}"}
response = requests.get(
    "https://api.unsplash.com/photos/random?orientation=landscape",
    headers=headers
)

🔍 결론적으로 확인해볼 것

✅ UNSPLASH_ACCESS_KEY가 올바르게 설정되었는가?
✅ data 응답 구조가 예상과 같은가? (st.write(data))
✅ 요청 제한이 걸린 것은 아닌가? (403 Forbidden)
✅ 헤더를 추가해서 요청하면 문제가 해결되는가?

이렇게 하나씩 확인해보면 원인을 찾을 수 있을 거야! 🚀

 

 

3. 이렇게 코드가 완성 되면 Streamlit에서는 API Key를 따로 넣어줘야 한다.