Tomcat의 web.inf 과 spring의 template

컨테이너·7일 전
0

SpringFramework

목록 보기
11/15
post-thumbnail

1. Tomcat의 WEB-INF란?

1-1. 기본 구조

WAR(Web Application Archive) 구조에서 웹 애플리케이션은 다음과 같은 디렉터리를 가진다:

webapp/
 ├── index.html
 ├── resources/
 ├── css/
 ├── js/
 └── WEB-INF/
      ├── web.xml
      ├── classes/
      ├── lib/

여기서 WEB-INF는 특별한 보호 디렉터리다.

1-2. WEB-INF의 특징

가장 중요한 특징:

클라이언트(브라우저)에서 직접 접근할 수 없다.

예:

http://localhost:8080/WEB-INF/views/login.jsp  →  접근 불가 (404 또는 Forbidden)

Tomcat(웹 컨테이너)이 보안 규약으로 WEB-INF 내부는 외부에서 바로 열리지 못하도록 하며,

오직 서버 내부에서 forward()를 통해서만 접근 가능하다.


2. 왜 WEB-INF는 직접 접근하면 안 되나?

이유는 명확하다.

1) JSP, 클래스 파일, 설정 파일은

“웹 브라우저가 직접 읽으면 안 되는 내부 자원” 이기 때문이다.

예를 들어:

  • JSP 파일에는 비즈니스 로직 일부 포함 (노출되면 보안 위험)
  • web.xml은 애플리케이션 설정 파일
  • classes/에는 컴파일된 서버 코드를 보관
  • lib/에는 JAR 라이브러리

실제로 외부 접근 허용되면:

  • 소스 코드 유출
  • 서버 정보 노출
  • 보안 취약점 증가

그래서 Tomcat의 규칙은 다음과 같다:

브라우저는 webapp 루트 아래 파일만 읽을 수 있고,

WEB-INF 내부는 절대 직접 읽지 못한다.


3. WEB-INF 내부 파일을 어떻게 접근하는가? (forward)

서블릿에서 아래처럼 forward() 를 통해 접근해야 한다.

RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/login.jsp");
rd.forward(request, response);

forward는 서버 내부에서 동작하기 때문에 WEB-INF 파일에 접근이 가능하다.

즉,

  • 브라우저는 접근할 수 없다.
  • 서블릿(컨테이너 내부 로직)만 접근할 수 있다.

4. JSP 프로젝트 구조에서 WEB-INF/views 를 쓰는 이유

JSP MVC 구조에서 컨트롤러가 보통 이런 식으로 동작한다:

  1. URL 요청 → 서블릿
  2. 서블릿에서 로직 처리
  3. JSP는 결과만 보여주는 화면(View)

이 때 JSP 파일이 만약 웹에서 직접 접근된다면

서블릿을 거치지 않고 JSP가 바로 실행되어 MVC 구조가 무너짐.

그래서 JSP는 WEB-INF/views 아래 넣는다.

WEB-INF/views/
     login.jsp
     home.jsp

각 JSP는 반드시 컨트롤러를 통해서만 접근 가능.


5. Spring Boot의 templates 과의 연결

이제 중요한 연결점:

Spring Boot는 WEB-INF가 없다.

Spring Boot는 내장 톰캣을 사용하며, WAR 구조 대신 JAR 실행 방식을 채택하기 때문에

전통적인 WEB-INF 폴더를 사용하지 않는다.

그러나 역할은 유지해야 하기 때문에 Spring Boot는 이렇게 설계했다:

전통 WEB-INF/views → Spring Boot에서는 templates/

Spring Boot MVC 구조는 다음과 같다:

src/main/resources/
 ├── static/
 ├── templates/
 └── application.yml
  • templates/ Thymeleaf, Mustache, Freemarker 등 서버 렌더링 템플릿 보관
  • static/ CSS, JS, 이미지 등 브라우저에서 직접 접근 가능한 정적 리소스

이 구조는 JSP 프로젝트의 다음 구조와 거의 같다:

전통 JSP:

webapp/
 ├── css, js 등 정적 리소스
 └── WEB-INF/views/   (외부 접근 불가)

Spring Boot:

static/         (외부 접근 가능)
templates/      (컨트롤러를 거쳐서만 접근 가능)

즉,


6. Spring Boot의 templates는 사실상 WEB-INF 역할이다

전통 Servlet/Tomcat 구조

역할위치외부 접근
정적 리소스webapp/css, js, img가능
JSP 파일WEB-INF/views불가능 (forward만 가능)

Spring Boot 구조

역할위치외부 접근
정적 리소스static/가능
HTML(Thymeleaf)templates/불가능 (Controller 필요)

templates 폴더는 Spring MVC Controller를 거쳐야만 뷰로 렌더링된다.

예:

@GetMapping("/login")
public String login() {
    return "login";
}

이렇게 하면 자동으로:

templates/login.html

이 렌더링된다.

브라우저에서 직접:

http://localhost:8080/templates/login.html

접근 불가.

WEB-INF 와 동일한 보안 원리이다.


7. 결론 정리

1) Tomcat의 WEB-INF

  • 내부 보호 디렉토리
  • 외부에서 직접 접근 불가
  • JSP, web.xml, classes, lib 보관
  • forward로만 접근 가능

2) 접근 방식

  • 브라우저: 접근 불가
  • 서블릿: RequestDispatcher.forward() 로 접근

3) Spring Boot와의 연관

  • Spring Boot는 전통적 WEB-INF 구조가 없다
  • 대신 templates 폴더가 WEB-INF/views의 역할을 대신한다
  • templates 이하의 파일은 컨트롤러를 거쳐야만 접근 가능
  • static 폴더만 외부 접근 가능

4) 핵심 요약

  • WEB-INF = 외부 차단, 내부 접근 전용
  • Spring Boot templates = WEB-INF/views 대체

profile
백엔드

0개의 댓글