[TIL] 사용자 정보를 포함한 인증 정보 전달 방법

냠냠빈·2025년 1월 6일

🔐 들어가며

사용자 인증 정보를 안전하고 효율적으로 전달하는 것은 웹 애플리케이션 개발에서 매우 중요한 부분입니다. 인증 정보는 주로 URL, 헤더, 또는 바디에 포함되는데, 각각의 방식에는 장단점과 보안상의 고려사항이 있습니다.


🌐 URL에 담는 경우

특징

URL에 인증 정보를 포함하는 방식은 간단하고 직관적이지만, 보안에 취약합니다. 특히 GET 요청에서 자주 사용되며, 브라우저 히스토리나 서버 로그에 민감한 정보가 기록될 수 있습니다.

장점

  • 간편함: URL 파라미터로 쉽게 데이터를 전달할 수 있습니다.
  • 디버깅 용이: URL에 명시적으로 포함되므로 디버깅 과정에서 데이터 확인이 쉽습니다.

단점

  • 보안 취약: URL은 브라우저 히스토리, 로그 파일, 북마크 등에 저장될 가능성이 있어 민감한 정보 노출 위험이 큽니다.
  • 길이 제한: 일부 브라우저와 서버는 URL 길이에 제한이 있으므로 대량의 데이터를 포함하기 어렵습니다.

예시

GET /api/resource?token=eyJhbGciOiJIUzI1NiIsInR5cCI...

보안 권장 사항

  • 민감한 정보를 URL에 포함하지 않는 것이 최선입니다.
  • 만약 부득이하게 URL에 정보를 포함해야 한다면, 짧은 유효 기간의 토큰을 사용하고 HTTPS로 암호화된 요청을 보장해야 합니다.

📜 헤더에 담는 경우

특징

헤더에 인증 정보를 포함하는 방식은 가장 널리 사용되는 방식입니다. RESTful API와 같은 현대적 시스템에서 표준으로 자리 잡았습니다.

장점

  • 보안성: URL에 비해 민감한 정보가 노출될 가능성이 낮습니다.
  • 표준화: 대부분의 인증 프로토콜(예: OAuth, JWT)이 헤더 기반 방식을 채택하고 있습니다.
  • 유연성: GET, POST 등 모든 HTTP 메서드와 호환됩니다.

단점

  • 추가 설정 필요: 클라이언트와 서버에서 헤더를 명시적으로 처리해야 합니다.

예시

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI...

실무 활용

  • Bearer 토큰: 토큰 기반 인증에서 Authorization 헤더를 활용하는 방식이 가장 일반적입니다.
  • Custom 헤더: 특정 애플리케이션 요구 사항에 맞게 사용자 정의 헤더를 사용할 수도 있습니다. 예: X-Auth-Token.

📝 바디에 담는 경우

특징

바디에 인증 정보를 포함하는 방식은 주로 POST, PUT 요청에서 사용됩니다. URL이나 헤더에 담기 어려운 대량의 데이터를 처리할 수 있습니다.

장점

  • 보안성: HTTPS를 사용하면 바디 내용이 암호화되므로 안전합니다.
  • 유연성: 구조화된 데이터를 JSON, XML 등으로 전달할 수 있습니다.

단점

  • GET 요청 제한: GET 요청에서는 바디를 사용할 수 없습니다.
  • 추가 작업 필요: 서버가 요청 바디를 파싱해야 하므로 약간의 성능 부담이 발생할 수 있습니다.

예시

POST /api/login HTTP/1.1
Content-Type: application/json

{
  "username": "user1",
  "password": "password123"
}

실무 활용

  • 로그인 요청: 사용자 인증 정보를 서버로 전송할 때 일반적으로 사용됩니다.
  • 대량 데이터 전송: 추가 메타데이터와 함께 인증 정보를 전달할 때 유용합니다.

🔍 실무에서의 선택 기준

  1. 민감한 정보 보호: URL을 제외하고 헤더 또는 바디를 활용하는것이 좋습니다.

  2. RESTful API 설계: 헤더에 인증 정보를 포함하는 것이 표준적이고 권장됩니다.

  3. 요청 종류에 따른 선택:

    • 로그인 요청: POST 요청의 바디에 사용자 정보 포함
    • 인증 토큰 전달: Authorization 헤더 활용

🛡️ 보안 강화 방안

1. HTTPS 사용

  • 모든 요청은 HTTPS를 통해 암호화된 채널로 전달해야 합니다.
  • HTTPS가 적용되지 않은 경우, 민감한 정보가 쉽게 노출될 수 있습니다.

2. 짧은 유효 기간의 토큰

  • 토큰의 유효 기간을 짧게 설정하여 노출 위험을 줄입니다.
  • Refresh Token을 활용해 필요 시 새로운 Access Token을 발급합니다.

3. 서명된 JWT 사용

  • JWT를 사용할 때 비밀 키를 활용해 서명하여 변조를 방지합니다.
  • 서명을 검증하지 않은 토큰은 신뢰해서는 안 됩니다.

4. 민감한 데이터 최소화

  • 토큰에는 필요한 최소한의 정보만 포함해야 합니다.
  • 사용자 비밀번호와 같은 민감한 정보를 직접적으로 포함하지 마세요.

📚 참고문헌

사용자 정보를 담는 위치
JWT란 무엇인가?
[HTTP]HTTP란? (Header와 Body)
[출처] [HTTP]HTTP란? (Header와 Body)|작성자 로그

2장: API 프로토콜
RESTful API 설계 가이드

profile
다 먹어버릴거야!

0개의 댓글