일반적으로 HTTP
요청을 보내면 두 개의 서버를 통해 엔드포인트에 도달하게 된다. WS (Web Server)와 WAS (Web Application Server)이다.
개발환경에서는 저런식으로 서버를 구성하지 않는데도 잘 동작하는데, 운영 환경에서는 서버를 일반적으로 저렇게 구성한다.
각각의 역할과 차이를 알아보고 왜 저런 구성이 되는지 알아보자.
Web Server는 Nginx
, Apache
와 같은 서버를 말하며, 정적 컨텐츠(HTML
, CSS
, JavaScript
, 이미지 등)를 클라이언트에 제공하는 역할을 담당한다.
여기서 말하는 정적 컨텐츠란 별도의 가공 없이 그대로 반환하는 컨텐츠를 말한다.
즉, http://domain.com/css/style.css
와 같은 요청이 오면 웹서버는 별다른 처리를 하지않고 해당 파일을 그대로 반환해준다.
server {
listen 80;
server_name yourdomain.com;
# 정적 파일 제공
location /static/ {
root /var/www/html;
}
# 동적 요청을 WAS로 프록시
location / {
proxy_pass http://localhost:8080; # WAS가 8080 포트에서 동작
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
nginx
를 예로 들면 위와 같이 설정함으로써 /static/
경로로 시작하는 요청은 nginx
가 직접 /var/www/html
경로 하위에 있는 파일을 찾아 반환하고, 나머지 모든 요청은 WAS
로 전달한다.
그와 반대로 Web Application Server 서버는 Tomcat
, Jeus
와 같은 서버로, 동적 컨텐츠를 생성하고, 비즈니스 로직을 처리하는 역할을 담당한다.
여기서 말하는 동적 컨텐츠란 파일을 그대로 반환하는 것이 아닌 데이터베이스와의 상호작용, 사용자 인증, 세션 관리 등 복잡한 비즈니스 로직의 처리를 말한다.
@Controller
public class MyController {
@GetMapping("/greeting")
public String greeting(Model model) {
model.addAttribute("message", "안녕하세요!");
return "greeting"; // 뷰 이름 (예: greeting.html)
}
}
Spring MVC
를 예로 들면 위와 같이 데이터를 Model
에 담고 응답을 반환하는 역할은 WAS
서버가 담당한다.
물론 WAS
에도 웹서버가 내장되어 있기 때문에, 개발 단계에서 별도의 웹서버 없이 웹 애플리케이션만 실행해서 사용해도 문제없이 잘 작동한다.
하지만 트래픽이 증가할 경우 WAS
가 이 모든 업무를 처리하기엔 부담이 될 수 있다. 또한 이 둘의 역할을 분리함으로써 각각을 필요에 따라 독립적으로 확장할 수 있다는 장점이 있다.
그리고 웹서버는 이러한 역할에 맞게 정적 파일 제공에 최적화 되어있어 WS
와 WAS
의 성능을 최적화 할 수 있다는 장점이 있다.
또한, 백엔드를 API
로 개발할 경우 프론트엔드를 WS
로 두어 외부와의 직접적인 접근을 제한하고 WAS
는 내부 네트워크에서만 접근하도록 하는 등 보안을 강화할 수 있다.
이렇게 구성할 경우 WS
에 SSL
을 적용하고 내부에서는 HTTP
로 평문 데이터를 사용하거나, WAS
의 로드밸런싱 설정, 웹 애플리케이션 방화벽(WAF
), 자주 사용하는 데이터의 캐싱 등 다양한 방면에서 WAS
의 부담을 줄여줄 수 있다.