프로그래밍

JWT 에서 토큰을 전달할때 Header의 Authorizaion 을 사용해야만 하는가?

가우리언 2024. 12. 23.
728x90
반응형

 

아닙니다. JWT 토큰을 전달할 때 꼭 HTTP Header의 Authorization 헤더를 사용해야 하는 것은 아닙니다. Authorization 헤더는 가장 일반적이고 권장되는 방법 중 하나일 뿐입니다. 다른 방법도 상황에 따라 적절히 사용할 수 있습니다. 아래에서 각 방법과 장단점을 설명합니다.


1. Authorization 헤더 사용 (권장)

JWT를 전달할 때, 아래와 같이 Authorization 헤더에 Bearer 토큰으로 포함하는 방법이 일반적입니다.

Authorization: Bearer <JWT>

장점

  • 표준화: 대부분의 인증 라이브러리와 프레임워크에서 기본적으로 지원.
  • 보안: 토큰이 헤더에 포함되므로 민감한 데이터와 혼합되지 않음.
  • 캐싱 방지: HTTP 캐시 메커니즘에 의해 민감한 데이터가 캐시되는 문제를 방지.

단점

  • 클라이언트 측에서 별도의 헤더 설정이 필요함.
  • WebSocket 같은 특정 프로토콜에서는 사용하기 어려울 수 있음.

2. 쿼리 파라미터 사용

JWT를 URL의 쿼리 파라미터로 전달하는 방식입니다.

GET /api/resource?token=<JWT>

장점

  • 간단함: 헤더를 설정할 필요 없이 URL만으로 전달 가능.
  • WebSocket 및 이미지 요청: WebSocket, 이미지 요청 등에서 쉽게 사용 가능.

단점

  • 보안 문제: URL이 로그, 브라우저 기록, 리퍼러에 저장될 수 있어 보안에 취약.
  • 캐싱 위험: URL 기반의 캐싱 시스템이 토큰을 저장할 가능성 있음.

3. 쿠키 사용

JWT를 클라이언트의 쿠키에 저장하고 전달하는 방식입니다.

Set-Cookie: token=<JWT>; HttpOnly; Secure;

장점

  • 자동 전송: 클라이언트가 쿠키를 자동으로 서버에 전송.
  • XSS 방지: HttpOnly 및 Secure 플래그를 사용하면 브라우저 스크립트에서 접근 불가.

단점

  • CSRF 취약성: CSRF 공격에 대비해 CSRF 토큰이나 SameSite 플래그가 필요.
  • CORS 설정: 다른 도메인으로 요청 시 CORS 설정이 필요할 수 있음.

4. 본문 (Body) 사용

POST 요청의 본문에 JWT를 포함하는 방식입니다.

{
  "token": "<JWT>"
}

장점

  • 단순성: RESTful API 요청 본문과 통합 가능.
  • URL 정리: 민감한 정보가 URL에 노출되지 않음.

단점

  • 추가 작업: API 설계 시 토큰을 별도의 필드로 다뤄야 함.
  • GET 요청 불가: POST 요청에서만 사용 가능.

5. WebSocket Subprotocol

WebSocket 연결 시 JWT를 Subprotocol로 전달할 수 있습니다.

new WebSocket("wss://example.com", ["jwt", "<JWT>"]);

장점

  • WebSocket에 최적화.
  • 초기 연결 시 인증 정보를 명확히 전달 가능.

단점

  • WebSocket 연결에만 사용 가능.
  • 서버에서 Subprotocol 처리가 필요.

결론

Authorization 헤더를 사용하는 것이 가장 표준적이고, 보안과 확장성을 고려할 때 권장되는 방법입니다. 하지만 특정 상황에서는 다른 전달 방식이 더 적합할 수 있습니다. 예를 들어:

  • SPA에서는 Authorization 헤더를 사용.
  • WebSocket에서는 Subprotocol 사용.
  • 이미지 또는 정적 자원 요청 시 쿼리 파라미터 사용.

각 방식의 장단점을 고려해 적합한 방식을 선택하세요.

 

728x90
반응형

댓글