웹 애플리케이션 설계

see1237·2022년 10월 18일
0

Section4

목록 보기
12/13

CORS

  • 동작방식
    • 프리플라이트 요청
      • 실제 요청을 보내기 전, OPTIONS 메서드로 사전 요청을 보내 해당 출처 리소스에 접근 권한이 있는지부터 확인
    • 단순 요청
      • 특정 조건이 만족되면 프리플라이트 요청을 생략하고 요청
    • 인증정보를 포함한 요청
      • 요청 헤더에 인증 정보를 담아 보내는 요청
      • 프론트, 서버 양측 모두 CORS 설정이 필요
  • CORS 정책 설정 방법
    • Global 설정 클래스를 이용해 특정 도메인에 모두 적용하는 방법
    • 애너테이션을 이용해 컨트롤러에서 설정하는 방법
      • @CrossOrigin 애너테이션을 이용해 컨트롤러 혹은 메서드에서 CORS 정책을 설정
  • CSRF
    • CORS는 Cross-Origin(다른 출처), CSRF는 Cross-Site(다른 사이트)일 때의 설정을 해줘야 하는 점에서 매우 유사
    • CSRF는 사이트 간 요청을 위조하는 공격을 의미. 즉 신뢰할 수 있는 사용자를 가장하여 웹 사이트에 원치 않는 명령을 보내는 방식
    • Spring Security는 기본적으로 아무 설정을 하지 않아도 CSRF 공격을 방지 하기 위해 클라이언트로부터 CSRF Token을 수신 후 검증

솔로 프로젝트

Tomcat을 이용해 수동 배포하기

  • JAR(Java Archive)와 WAR(Web application Archive)
    -> 둘 다 애플리케이션을 배포하고 동작할 수 있도록 만든 압축파일이다.
    • JAR: 자바 프로젝트를 압축한 파일로 JRE만 있어도 쉽게 실행가능하다.
    • WAR는 웹 관련 자원을 포함하며 웹 애플리케이션을 압축한 파일. 기본적으론 별도의 웹 서버가 필요하며 JAR보다 더 넓은 범위를 압축하기 위한 포맷으로 볼 수 있다.
  • JDK 11 버전을 사용하는 경우 Tomcat 9 버전과 가장 호환성이 높다.
  • 톰캣파일 구조
    • bin : 톰캣을 실행하거나 종료할 수 있는 스크립트 파일이 들어있다.
    • conf : 서버 설정 파일이 들어있다.
    • webapps : 톰캣 위에서 실행할 웹 애플리케이션의 기본 저장 경로. .war 파일을 이 곳에 이동시키거나, 설정파일에서 경로를 변경하여 실행할 수 있다.
  • 서버 실행 및 종료 명령어
    {username}@{root} bin % ./startup.sh # 톰캣 실행
    {username}@{root} bin % ./shutdown.sh # 톰캣 종료

톰캣으로 웹 애플리케이션 실행

JAR → WAR 포맷 변경

  1. build.gradle → plugins에 id 'war' 추가

  2. {project}Application파일 수정

    @SpringBootApplication
    public class sampleApplication extends SpringBootServletInitializer { // (1)
    
        public static void main(String[] args) {
            SpringApplication.run(sampleApplication.class, args);
        }
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { // (2)
            return builder.sources(sampleApplication.class);
        }
    }

프로젝트 빌드

  • ./gradlew build 명령어를 이용해 프로젝트 빌드
  • 생성된 .war파일을 톰캣의 webapps 디렉토리 하단으로 이동
    • .war파일의 이름이 ROOT인 경우 별도의 변경 없이 실행가능하지만, 다른 이름인 경우 conf > server.xml파일에서 추가 설정을 진행

Ngrok을 이용해 로컬에서 서버 실행하기

  • Ngrok은 네트워크 설정을 하지 않아도 방화벽을 넘어 외부에서 로컬 환경에 접근할 수 있게 해주는 터널링 프로그램
  • ngrok http {port} → 원하는 포트를 연결하여 실행

To-Do앱 개발 에러노트

  • SQL 문법 - expected "identifier" 오류
    order라는 Column이름이 SQL의 예약어 중 하나이기 때문에 쓸 수 없었다.

    💡 Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000a alter table to_do \000a add constraint UK_g4hrfmujgwec0rfkt7ktpdw3h unique ([*]order)"; expected "identifier"; SQL statement:
    @Column(name = "TODO_ORDER") 추가하여 해결

  • validation anotation 사용 오류 - 타입에 다라 다르게 사용해야 한다.

    💡 javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.lang.Boolean'.
    Boolean 타입이므로 @NotBlank가 아닌 @NotNull로 바꿔주었다.

    • @NotNull @NotEmpty @NotBlank 차이
      • @NotNull
        모든 타입에 대해 null을 허용하지 않는다.
      • @NotEmpty
        • CharSequence (length of character sequence is evaluated)
        • Collection (collection size is evaluated)
        • Map (map size is evaluated)
        • Array (array length is evaluated)
          위의 나열된 타입에 대해 null, 빈 값을 허용하지 않는다.
      • @NotBlank
        CharSequence 타입에 대해 null을 허용하지 않고, 최소 한 개 이상의 공백 문자가 아닌 문자를 포함해야 한다. (String은 CharSequence 구현체이므로 해당된다.)

0개의 댓글