최근 웹 개발에서 보안이 중요한 이슈로 대두되면서, 많은 개발자들이 JWT(Json Web Token)를 활용하여 클라이언트와 서버 간의 안전한 인증을 구현하고 있습니다. 그런데 여기서 흥미로운 점은, 개발자들이 JWT 토큰을 클라이언트에 전달할 때 responsebody가 아닌 responseheader를 통해 전달한다는 것입니다. 왜 그런 걸까요?
1. 보안 향상
CSRF 보호
JWT를 responsebody로 전달하면, 클라이언트는 이를 로컬 스토리지나 세션 스토리지에 저장하게 됩니다. 그러나 이러한 저장 방식은 CSRF(Cross-Site Request Forgery) 공격에 취약할 수 있습니다. JWT를 responseheader로 전달하면 클라이언트는 이를 쿠키에 저장할 수 있고, 쿠키에 SameSite 속성을 설정하여 CSRF 공격을 효과적으로 방지할 수 있습니다.
XSS 보호
JWT가 responsebody로 전달되면 클라이언트에서 이를 쉽게 접근할 수 있어 XSS(Cross-Site Scripting) 공격에 노출될 가능성이 높아집니다. 반면, JWT를 responseheader로 전달하여 쿠키에 저장하면, 쿠키에 HttpOnly 속성을 추가할 수 있어 JavaScript로 쿠키를 읽을 수 없게 되어 XSS 공격을 완화할 수 있습니다.
2. 표준 및 관례
JWT를 쿠키에 저장하여 사용하는 것은 일반적인 관례입니다. 이 방법은 클라이언트와 서버 간의 인증을 처리하는 데 있어 표준적이며, 많은 라이브러리와 프레임워크가 이를 지원합니다. 또한, Authorization 헤더에 JWT를 포함시키는 것도 일반적인 관례입니다. 예를 들어, Authorization: Bearer <token> 형식으로 요청 헤더에 포함시키는 것이 RESTful API 디자인에서 널리 사용됩니다.
3. 분리된 역할
프론트엔드와 백엔드 간의 명확한 역할 분리를 유지할 수 있습니다. 백엔드는 클라이언트에게 JWT를 제공하고, 클라이언트는 이를 적절한 방식으로 저장하고 관리합니다. 이를 통해 양측 간의 책임이 명확해지고, 코드의 유지보수가 용이해집니다.
4. 캐싱 및 프록시 서버
HTTP 응답 본문(responsebody)에 토큰을 포함시키면 프록시 서버나 캐싱 메커니즘이 이를 캐시하여 보안 위험이 발생할 수 있습니다. 반면, 응답 헤더는 이러한 캐시 메커니즘에 의해 처리되지 않거나 설정을 통해 제어할 수 있습니다.
실용적인 예시
JWT를 헤더로 전달하여 쿠키에 저장
백엔드에서 JWT를 생성하여 응답 헤더에 설정합니다
response.setHeader("Authorization", "Bearer " + jwtToken);
클라이언트에서는 응답 헤더에서 JWT를 추출하여 쿠키에 저장합니다
// 클라이언트에서 응답 헤더에서 JWT를 추출하여 쿠키에 저장
const token = response.headers.get('Authorization').split(' ')[1];
document.cookie = `jwt=${token}; HttpOnly; Secure; SameSite=Strict`;
JWT를 요청 헤더로 전송
클라이언트에서 요청 헤더에 JWT를 포함하여 요청을 전송합니다
// 클라이언트에서 요청 헤더에 JWT를 포함하여 요청 전송
fetch('https://api.com', {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`
}
});
결론
개발자들이 JWT를 responsebody가 아닌 responseheader로 전달하는 이유는 보안 강화를 위한 여러 가지 이유가 있습니다. CSRF와 XSS 공격 방지, 표준 및 관례 준수, 역할 분리, 캐싱 및 프록시 서버 문제 해결 등이 그 주된 이유입니다. 이러한 방식을 통해 우리는 더 안전하고 견고한 웹 애플리케이션을 개발할 수 있습니다.
JWT를 활용한 인증 시스템을 구현할 때 이러한 이유들을 잘 이해하고 적용한다면, 보안이 강화된 웹 애플리케이션을 구축할 수 있을 것입니다.
'웹 공부' 카테고리의 다른 글
쉽게 이해하는 jwt-decode 라이브러리 - JSON Web Token 디코딩의 모든 것 (0) | 2024.05.16 |
---|---|
[jQuery] AJAX 응답 데이터 Body 및 Header안에 있는 데이터 호출 (0) | 2024.05.10 |
[JS] 부드러운 스크롤 애니메이션 라이브러리 활용이 아닌 순수 사용자 작성방법으로 해결해보기 (0) | 2024.05.01 |
[JS] jQuery 활용하여 시작일과 종료일 비교하여 일수 구하기 yyyy-mm-dd ~ yyyy-mm-dd = dd (1) | 2024.04.12 |
웹 페이지 접속 시 간혹 보이는 503 에러 (Service Unavailable)는 무엇인가? (0) | 2024.04.03 |