Skip to content

Commit 6b50428

Browse files
Add post: jQuery AJAX HTTP Header 추가하기
1 parent 4443b55 commit 6b50428

File tree

1 file changed

+317
-0
lines changed

1 file changed

+317
-0
lines changed
Lines changed: 317 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,317 @@
1+
---
2+
layout: post
3+
title: "Javascript jQuery AJAX 통신 시 HTTP Header에 값 추가하기"
4+
date: 2023-04-05 12:00:00 +0900
5+
categories: [Development, Tutorial]
6+
tags: [javascript, jquery, ajax, http-header, beforeSend, authorization]
7+
author: "Kevin Park"
8+
excerpt: "AJAX 통신 시 beforeSend와 setRequestHeader를 사용하여 HTTP 헤더에 인증 토큰을 추가하는 핵심 방법과 실제 활용 예시를 알아봅니다."
9+
---
10+
11+
# Javascript jQuery AJAX 통신 시 HTTP Header에 값 추가하기
12+
13+
## 🎯 핵심 해결책 (바로 사용 가능)
14+
15+
AJAX 통신 시 HTTP 헤더에 값을 추가하려면 **`beforeSend`** 옵션을 사용합니다.
16+
17+
```javascript
18+
$.ajax({
19+
method: "POST",
20+
url: "your-api-url",
21+
beforeSend: function(xhr) {
22+
xhr.setRequestHeader("Authorization", "Bearer your-token");
23+
xhr.setRequestHeader("x-api-key", "your-api-key");
24+
},
25+
success: function(response) {
26+
console.log(response);
27+
},
28+
error: function(xhr, status, error) {
29+
console.error('Error:', error);
30+
}
31+
});
32+
```
33+
34+
### 가장 많이 사용되는 패턴
35+
36+
**1. Authorization 헤더 추가**
37+
```javascript
38+
beforeSend: function(xhr) {
39+
xhr.setRequestHeader("Authorization", "Bearer " + accessToken);
40+
}
41+
```
42+
43+
**2. API Key 헤더 추가**
44+
```javascript
45+
beforeSend: function(xhr) {
46+
xhr.setRequestHeader("x-api-key", "your-api-key");
47+
}
48+
```
49+
50+
**3. 다중 헤더 추가**
51+
```javascript
52+
beforeSend: function(xhr) {
53+
xhr.setRequestHeader("Authorization", "Bearer " + token);
54+
xhr.setRequestHeader("Content-Type", "application/json");
55+
xhr.setRequestHeader("X-Custom-Header", "custom-value");
56+
}
57+
```
58+
59+
---
60+
61+
## 📚 상세 설명
62+
63+
### beforeSend가 필요한 이유
64+
65+
웹 애플리케이션에서 API 서버와 통신할 때 보안을 위해 HTTP 헤더에 인증 정보를 포함해야 하는 경우가 많습니다. 특히 다음과 같은 상황에서 필수적입니다:
66+
67+
- **REST API 인증**: JWT 토큰, Bearer 토큰
68+
- **AWS API Gateway**: API Key, IAM 인증
69+
- **타사 API 연동**: 각 서비스별 인증 키
70+
- **CSRF 보안**: 토큰 기반 보안 처리
71+
72+
### 실제 개발 사례
73+
74+
아래는 AWS API Gateway와 Cognito 인증을 사용하는 실제 개발 코드입니다:
75+
76+
```javascript
77+
$.ajax({
78+
method: "POST",
79+
url: "https://console-api.ciottb.com/dashboard",
80+
beforeSend: function(xhr) {
81+
xhr.setRequestHeader("Authorization", cognito.session.idToken.jwtToken);
82+
},
83+
error: function(xhr, status, error) {
84+
alert(xhr.responseJSON.errorMessage);
85+
Swal.fire({
86+
type: 'error',
87+
title: xhr.responseJSON.errorMessage,
88+
showConfirmButton: true,
89+
});
90+
},
91+
success: function(res) {
92+
$("#word_cloud").jqCloud(res.total.wordcloud);
93+
tot_wordList(res.total.word_cnt);
94+
risk(res.Apple, "#apple");
95+
risk(res.Canonical, "#Canonical");
96+
risk(res.Cisco, "#Cisco");
97+
risk(res.Debian, "#Debian");
98+
risk(res.Google, "#Google");
99+
risk(res.Linux, "#Linux");
100+
risk(res.Microsoft, "#Microsoft");
101+
risk(res.Redhat, "#Redhat");
102+
risk(res.Sqlite, "#Sqlite");
103+
}
104+
});
105+
```
106+
107+
### xhr.setRequestHeader() 메서드 상세
108+
109+
**구문**
110+
```javascript
111+
xhr.setRequestHeader(헤더명, 헤더값)
112+
```
113+
114+
**매개변수**
115+
- `헤더명`: HTTP 헤더의 이름 (문자열)
116+
- `헤더값`: 해당 헤더에 설정할 값 (문자열)
117+
118+
**주의사항**
119+
- `beforeSend` 콜백 내에서만 호출 가능
120+
- 대소문자 구분하지 않음 (HTTP 표준)
121+
- 동일한 헤더명으로 여러 번 호출 시 값이 누적됨
122+
123+
### 다양한 활용 예시
124+
125+
**1. 조건부 헤더 추가**
126+
```javascript
127+
$.ajax({
128+
method: "GET",
129+
url: "/api/data",
130+
beforeSend: function(xhr) {
131+
// 로그인 상태일 때만 토큰 추가
132+
const token = localStorage.getItem('accessToken');
133+
if (token) {
134+
xhr.setRequestHeader("Authorization", "Bearer " + token);
135+
}
136+
137+
// 개발 환경에서만 디버그 헤더 추가
138+
if (window.location.hostname === 'localhost') {
139+
xhr.setRequestHeader("X-Debug-Mode", "enabled");
140+
}
141+
}
142+
});
143+
```
144+
145+
**2. 동적 토큰 처리**
146+
```javascript
147+
function makeAuthenticatedRequest(url, data) {
148+
return $.ajax({
149+
method: "POST",
150+
url: url,
151+
beforeSend: function(xhr) {
152+
// 토큰 만료 체크 및 갱신
153+
const token = getValidToken(); // 토큰 검증 함수
154+
xhr.setRequestHeader("Authorization", "Bearer " + token);
155+
xhr.setRequestHeader("Content-Type", "application/json");
156+
},
157+
data: JSON.stringify(data)
158+
});
159+
}
160+
```
161+
162+
**3. 전역 헤더 설정**
163+
```javascript
164+
// 모든 AJAX 요청에 공통 헤더 적용
165+
$.ajaxSetup({
166+
beforeSend: function(xhr) {
167+
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
168+
169+
// 인증 토큰이 있을 때만 추가
170+
const token = sessionStorage.getItem('authToken');
171+
if (token) {
172+
xhr.setRequestHeader("Authorization", "Bearer " + token);
173+
}
174+
}
175+
});
176+
177+
// 이후 모든 $.ajax() 호출에 자동으로 헤더 추가됨
178+
$.get("/api/user/profile", function(data) {
179+
console.log(data);
180+
});
181+
```
182+
183+
### 자주 사용되는 헤더 타입
184+
185+
**1. 인증 관련 헤더**
186+
```javascript
187+
// JWT 토큰
188+
xhr.setRequestHeader("Authorization", "Bearer " + jwtToken);
189+
190+
// API Key
191+
xhr.setRequestHeader("x-api-key", apiKey);
192+
xhr.setRequestHeader("X-API-KEY", apiKey);
193+
194+
// Basic 인증
195+
xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password));
196+
```
197+
198+
**2. 콘텐츠 관련 헤더**
199+
```javascript
200+
// JSON 데이터 전송
201+
xhr.setRequestHeader("Content-Type", "application/json");
202+
203+
// 파일 업로드
204+
xhr.setRequestHeader("Content-Type", "multipart/form-data");
205+
206+
// 응답 형식 지정
207+
xhr.setRequestHeader("Accept", "application/json");
208+
```
209+
210+
**3. 보안 관련 헤더**
211+
```javascript
212+
// CSRF 토큰
213+
xhr.setRequestHeader("X-CSRF-Token", csrfToken);
214+
215+
// 요청 출처 확인
216+
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
217+
218+
// 커스텀 보안 헤더
219+
xhr.setRequestHeader("X-Client-Version", "1.0.0");
220+
```
221+
222+
### 에러 처리 및 디버깅
223+
224+
**1. 헤더 관련 에러 처리**
225+
```javascript
226+
$.ajax({
227+
method: "POST",
228+
url: "/api/data",
229+
beforeSend: function(xhr) {
230+
try {
231+
xhr.setRequestHeader("Authorization", "Bearer " + getToken());
232+
} catch (error) {
233+
console.error("헤더 설정 오류:", error);
234+
return false; // 요청 중단
235+
}
236+
},
237+
error: function(xhr, status, error) {
238+
if (xhr.status === 401) {
239+
alert("인증이 필요합니다. 다시 로그인해주세요.");
240+
window.location.href = "/login";
241+
} else if (xhr.status === 403) {
242+
alert("권한이 없습니다.");
243+
}
244+
}
245+
});
246+
```
247+
248+
**2. 헤더 값 확인하기**
249+
```javascript
250+
$.ajax({
251+
beforeSend: function(xhr) {
252+
xhr.setRequestHeader("Authorization", "Bearer " + token);
253+
254+
// 개발자 도구에서 헤더 확인
255+
console.log("설정된 헤더:", {
256+
"Authorization": "Bearer " + token,
257+
"Content-Type": "application/json"
258+
});
259+
}
260+
});
261+
```
262+
263+
### AWS API Gateway 특화 예시
264+
265+
**1. Cognito 사용자 풀 인증**
266+
```javascript
267+
function callApiWithCognito(endpoint, data) {
268+
const cognitoUser = userPool.getCurrentUser();
269+
270+
cognitoUser.getSession((err, session) => {
271+
if (err) {
272+
console.error('세션 오류:', err);
273+
return;
274+
}
275+
276+
$.ajax({
277+
method: "POST",
278+
url: `https://your-api-id.execute-api.region.amazonaws.com/prod/${endpoint}`,
279+
beforeSend: function(xhr) {
280+
// Cognito JWT 토큰
281+
xhr.setRequestHeader("Authorization", session.getIdToken().getJwtToken());
282+
xhr.setRequestHeader("Content-Type", "application/json");
283+
},
284+
data: JSON.stringify(data),
285+
success: function(response) {
286+
console.log('성공:', response);
287+
}
288+
});
289+
});
290+
}
291+
```
292+
293+
**2. IAM 서명 인증 (AWS Signature V4)**
294+
```javascript
295+
$.ajax({
296+
method: "POST",
297+
url: "https://api.amazonaws.com/service",
298+
beforeSend: function(xhr) {
299+
// AWS SDK로 생성된 서명 헤더들
300+
xhr.setRequestHeader("Authorization", awsSignature);
301+
xhr.setRequestHeader("X-Amz-Date", amzDate);
302+
xhr.setRequestHeader("X-Amz-Security-Token", sessionToken);
303+
}
304+
});
305+
```
306+
307+
## 결론
308+
309+
jQuery AJAX에서 HTTP 헤더 추가는 `beforeSend` 옵션과 `xhr.setRequestHeader()` 메서드를 사용하여 간단하게 구현할 수 있습니다.
310+
311+
**핵심 포인트**:
312+
- `beforeSend` 콜백에서 `xhr.setRequestHeader(헤더명, 헤더값)` 사용
313+
- 인증 토큰, API 키 등 보안 정보 전송에 필수
314+
- 조건부 헤더 추가 및 에러 처리 고려
315+
- AWS API Gateway 등 클라우드 서비스 연동 시 활용
316+
317+
이 방법을 통해 안전하고 효율적인 API 통신을 구현할 수 있습니다.

0 commit comments

Comments
 (0)