> ## Documentation Index
> Fetch the complete documentation index at: https://generaltranslation.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 모범 사례

export const Button = ({href, children}) => {
  return <div className="not-prose group">
    <a href={href}>
      <button className="flex items-center space-x-2.5 py-1 px-4 bg-primary-dark dark:bg-white text-white dark:text-gray-950 rounded-full group-hover:opacity-[0.9] font-medium">
        <span>
          {children}
        </span>
        <svg width="3" height="24" viewBox="0 -9 3 24" class="h-6 rotate-0 overflow-visible"><path d="M0 0L3 3L0 6" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></path></svg>
      </button>
    </a>
  </div>;
};

API 키와 토큰은 각별히 주의해서 보호해야 합니다. 

이 자격 증명은 [developer App](/ko/resources/fundamentals/developer-apps) 자체와, 해당 App이 대신 요청을 보내도록 승인을 받은 X 계정에 직접 연결되어 있습니다. 키가 유출되면, 악의적인 사용자가 이를 이용해 developer App 또는 그 App이 승인한 사용자들을 대신해 X 엔드포인트에 요청을 보낼 수 있습니다. 이렇게 되면 예기치 않게 요청 한도에 도달하거나, 유료 접근 할당량을 모두 소진하게 되거나, 심지어 developer App이 정지될 수도 있습니다.

다음 섹션에서는 API 키와 토큰을 관리할 때 고려해야 할 모범 사례를 설명합니다.

<div id="regenerate-api-keys-and-tokens">
  ## API 키 및 토큰 재생성
</div>

API 키가 노출되었다고 생각되는 경우, 다음 단계를 따라 API 키를 재생성해야 합니다.

1. [개발자 콘솔의 "Apps" 페이지](https://developer.x.com/en/portal/projects-and-apps.html)로 이동합니다.
2. 해당 App 옆에 있는 "Keys and tokens" 아이콘(🗝)을 클릭합니다.
3. 재생성하려는 키와 토큰 세트 옆에 있는 "Regenerate" 버튼을 클릭합니다. 

Access Token 또는 Bearer 토큰을 프로그래밍 방식으로 재생성하려면 인증 엔드포인트를 사용하면 됩니다.

* Access Token을 재생성하려면 먼저 [POST oauth/invalidate\_token](/ko/resources/fundamentals/authentication/api-reference#post-oauth2-invalidate-token) 엔드포인트를 사용하여 토큰을 무효화한 뒤, [3-legged OAuth flow](/ko/resources/fundamentals/authentication/oauth-1-0a/obtaining-user-access-tokens)를 사용하여 토큰을 재생성해야 합니다.
* Bearer 토큰을 재생성하려면 먼저 [POST oauth2/invalidate\_token](/ko/resources/fundamentals/authentication/api-reference#post-oauth2-invalidate-token) 엔드포인트를 사용하여 토큰을 무효화한 뒤, [POST oauth2/token](/ko/resources/fundamentals/authentication/api-reference#post-oauth2-token) 엔드포인트를 사용하여 토큰을 재생성해야 합니다.

<div id="having-a-central-file-for-your-secrets">
  ## 비밀 정보를 위한 단일 파일 사용
</div>

`.ENV` 파일이나 다른 형태의 `.yaml` 파일을 만들어 비밀 정보를 저장하는 방식은 유용할 수 있지만, 이러한 파일이 실수로 git 저장소에 커밋되지 않도록 `.gitignore` 파일을 철저히 설정해야 합니다. 

<div id="environment-variables">
  ## 환경 변수
</div>

환경 변수를 사용하는 코드를 작성하면 유용할 수 있습니다. 

다음은 Python으로 작성한 예시입니다:

```python theme={null}
import os

consumer_key = os.environ.get("CONSUMER_KEY")

consumer_secret = os.environ.get("CONSUMER_SECRET")
```

터미널에서 다음과 같이 입력합니다:

```bash theme={null}
export CONSUMER_KEY='xxxxxxxxxxxxxxxxxxx'
export CONSUMER_SECRET='xxxxxxxxxxxxxxxxxxxxxxx'
```

<div id="source-code-and-version-control">
  ## 소스 코드와 버전 관리
</div>

개발자가 가장 흔하게 저지르는 보안 실수는 GitHub, BitBucket 같은 접근할 수 있는 버전 관리 시스템의 소스 코드에 API 키와 토큰을 커밋하는 것입니다. 이러한 코드 저장소 중 상당수는 공개되어 있습니다. 공개 코드 저장소에서 이 실수가 너무 자주 발생하기 때문에 API 키를 긁어 모으는, 수익을 올리는 봇들까지 존재합니다.

* 서버 환경 변수를 사용하세요. API 키를 환경 변수에 저장하면 코드와 버전 관리 저장소 밖에 두게 됩니다. 이렇게 하면 환경별로 서로 다른 키를 쉽게 사용할 수도 있습니다.
* 버전 관리에서 제외된 설정 파일을 사용하세요. 해당 파일 이름을 [.gitignore](https://git-scm.com/docs/gitignore) 파일에 추가해 버전 관리에서 추적되지 않도록 하세요.
* 버전 관리를 사용한 후에 코드에서 API 키를 제거하더라도, 코드베이스의 이전 버전에 접근하면 API 키에 여전히 접근할 수 있는 경우가 많습니다. 다음 섹션에 설명된 대로 API 키를 다시 생성하세요.

<div id="databases">
  ## 데이터베이스
</div>

액세스 토큰을 데이터베이스에 저장해야 하는 경우, 다음 사항을 유의하세요:

* 액세스 토큰을 해당 토큰의 소유자만 읽을 수 있도록 데이터베이스 접근을 제한합니다.
* 액세스 토큰용 데이터베이스 테이블에 대한 수정/쓰기 권한을 제한합니다 - 이는 키 관리 시스템을 통해 자동화해야 합니다.
* 어떤 데이터 저장소에 저장하든, 저장하기 전에 액세스 토큰을 반드시 암호화합니다.

<div id="password-management-tools">
  ## 비밀번호 관리 도구
</div>

1password나 Last Pass와 같은 비밀번호 관리 도구는 키와 토큰을 안전한 곳에 보관하는 데 유용합니다. 다만 팀에서 함께 사용하는 공유 비밀번호 관리 도구 안에서 이러한 정보를 공유하는 것은 피하는 것이 좋습니다.

<div id="web-storage-cookies">
  ## 웹 스토리지 & 쿠키
</div>

웹 스토리지에는 LocalStorage와 SessionStorage 두 가지 유형이 있습니다. 이는 Cookie를 사용하는 방식의 개선 버전으로 만들어졌으며, 웹 스토리지는 Cookie에 비해 훨씬 더 큰 저장 용량을 제공합니다. 다만 각 저장 방식마다 서로 다른 장단점이 있습니다.
 

**Web Storage: LocalStorage**

로컬 웹 스토리지에 저장되는 모든 데이터는 지속적으로 유지됩니다. 이는 데이터를 명시적으로 삭제하기 전까지 계속 남아 있다는 뜻입니다. 프로젝트의 요구 사항에 따라 이것을 장점으로 볼 수도 있습니다. 하지만 LocalStorage를 사용할 때에는 주의해야 합니다. 데이터에 대한 변경/추가 사항이 해당 웹페이지를 이후에 방문할 때마다 계속 반영되기 때문입니다. 일반적으로 LocalStorage 사용은 권장하지 않지만, 몇 가지 예외적인 경우는 있을 수 있습니다. LocalStorage를 사용하기로 했다면, 동일 출처 정책(same-origin policy)을 지원한다는 점을 알아두면 좋습니다. 여기 저장된 모든 데이터는 동일한 origin에서만 접근할 수 있습니다. LocalStorage 사용 시의 추가적인 성능상의 이점으로는, 매 HTTP 요청마다 서버로 데이터를 다시 전송할 필요가 없으므로 클라이언트-서버 트래픽이 감소한다는 점이 있습니다.
 

**Web Storage: SessionStorage**

SessionStorage는 LocalStorage와 유사하지만, 가장 큰 차이점은 SessionStorage는 지속적이지 않다는 점입니다. SessionStorage에 쓰기 작업을 수행했던 창(또는 사용하는 브라우저에 따라 탭)을 닫으면 데이터는 사라집니다. 이는 사용자 세션 내에서 토큰에 대한 읽기 접근을 제한하는 데 유용합니다. 보안 관점에서 보면, 일반적으로 LocalStorage보다 SessionStorage를 사용하는 것이 더 바람직합니다. LocalStorage와 마찬가지로, 동일 출처 정책 지원과 클라이언트-서버 트래픽 감소라는 장점은 SessionStorage에도 동일하게 적용됩니다.
 

**Cookies**

쿠키는 세션 데이터를 저장하는 보다 전통적인 방식입니다. 각 쿠키마다 만료 시간을 설정할 수 있어, 권한 회수와 접근 제한을 보다 쉽게 할 수 있습니다. 다만 쿠키를 사용할 경우, 데이터가 매 HTTP 요청마다 서버로 전송되므로 클라이언트-서버 트래픽은 확실히 증가합니다. 쿠키를 사용하기로 했다면 세션 하이재킹(session hijacking)에 대비해야 합니다. 기본적으로 쿠키는 HTTP 상에서 평문으로 전송되며, 이로 인해 패킷 스니핑 및/또는 중간자 공격(man-in-the-middle attack)에 취약해져 공격자가 트래픽을 수정할 수 있습니다. 전송 중인 데이터를 보호하기 위해 항상 HTTPS를 강제해야 합니다. 이렇게 하면 기밀성, 무결성(데이터의 무결성), 그리고 인증이 보장됩니다. 하지만 웹 애플리케이션이나 사이트가 HTTP와 HTTPS 양쪽 모두에서 접근 가능한 경우에는 쿠키에 'Secure' 플래그를 사용하는 것이 좋습니다. 이 플래그는 공격자가 사이트의 HTTP 버전에 대한 링크를 사용자에게 보내고, 그로 인해 발생하는 HTTP 요청을 엿듣는 것을 방지합니다.

쿠키 사용 시 세션 하이재킹에 대한 또 다른 2차 방어 수단으로는, 중요도가 높은 작업을 수행하기 전에 사용자의 신원을 다시 검증하는 방법이 있습니다. 쿠키 보안을 높이기 위해 고려해야 할 또 다른 플래그는 'HttpOnly' 플래그입니다. 이 플래그는 해당 쿠키가 지정된 서버를 통해서만 접근 가능하도록 브라우저에 지시합니다. 클라이언트 측 스크립트가 쿠키에 접근하려는 모든 시도는 이 플래그에 의해 차단되며, 이를 통해 대부분의 크로스 사이트 스크립팅(XSS) 공격에 대한 방어에 도움이 됩니다.
