Spring Security - CSRF 및 X-frame

Jobmania·2023년 5월 24일
0

스프링 

목록 보기
3/5
post-thumbnail

CSRF란?

CSRF(cross site request forgery)는 웹 사이트 취약점 공격을 방지를 위해 사용하는 기술이다. 스프링 시큐리티가 CSRF 토큰 값을 세션을 통해 발행하고 웹 페이지에서는 폼 전송시에 해당 토큰을 함께 전송하여 실제 웹 페이지에서 작성된 데이터가 전달되는지를 검증하는 기술이다.

다만 JWT토큰을 사용하면 결국 토큰값으로 인증하기 때문에 CSRF 공격은 무시가능, 세션 & 쿠키 로그인 방식은 만약 세션ID가 탈취되더라도 해당 토큰값에서 실제 요청되었는지 확인하기 때문에 검증가능

이 오류를 해결하기 전에 질문 등록 화면을 열고 브라우저의 소스보기 기능을 이용하여 질문 등록 화면의 소스를 잠시 확인해 보자.

스프링 시큐리티에 의해 위와 같은 CSRF 토큰이 자동으로 생성된다. 즉, 스프링 시큐리티는 이렇게 발행한 CSRF 토큰의 값이 정확한지 검증하는 과정을 거친다. (만약 CSRF 값이 없거나 해커가 임의의 CSRF 값을 강제로 만들어 전송하는 악의적인 URL 요청은 스프링 시큐리티에 의해 블록킹 될 것이다.)

만약 H2콘솔 사용시, H2 콘솔은 이와 같은 CSRF 토큰을 발행하는 기능이 없기 때문에 403 오류가 발생한다. 그래서 관련 요청은 CSRF 토큰이 없어도 허용할 수 있게 SpringSecurity설정을 해야한다.

  .and()
    .csrf().ignoringAntMatchers("/h2-console/**")

스프링 시큐리티는 사이트의 콘텐츠가 다른 사이트에 포함되지 않도록 하기 위해 X-frame-Options 헤더값을 사용하여 이를 방지한다. (clickjacking 공격을 막기위해 사용함)

그래서 h2-console 화면을 이렇게 막는다.

	.and()
		.headers()
		.addHeaderWriter(new XFrameOptionsHeaderWriter(
						XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN));

URL 요청시 X-Frame-Options 헤더값을 sameorigin으로 설정하여 오류가 발생하지 않도록 했다. X-Frame-Options 헤더의 값으로 sameorigin을 설정하면 frame에 포함된 페이지가 페이지를 제공하는 사이트와 동일한 경우에는 계속 사용할 수 있다.

이후 회원 로그인 로직을 다음과 같이 수행되며
만약 로그인한 User에 대해 권한 설정을 하고 싶다면 이를 ENUM 타입으로 설정가능.

import lombok.Getter;

@Getter
public enum UserRole {
    ADMIN("ROLE_ADMIN"),
    USER("ROLE_USER");


    private String value;

    UserRole(String value) {
        this.value = value;
    }

}
profile
HelloWorld에서 RealWorld로

0개의 댓글