Google OAuth2 로그인 로직을 작성하던 중, google client와 관련된 값을 Git에 push하려고 하니 보안 사항을 올릴 수 없다는 에러를 받은 적이 있다....! Git에 민감한 정보는 올리지 말라나뭐라나.. 그래서 application.yml파일에 중요한 정보를 직접 넣지 않고, .env 파일을 작성해 값을 삽입하는 방법을 찾아보았다!

1. .env파일 작성

GOOGLE_CLIENT_ID=abcdefg  		//실제 application.yml의 ${GOOGLE_CLIENT_ID}에 넣고 싶은 값
GOOGLE_CLIENT_SECRET=abcdefg	//실제 application.yml의 ${GOOGLE_CLIENT_SECRET}에 넣고 싶은 값

2. application.yml 작성

spring:
//////////////////////////////////////////////////////
  config:
    import: optional:file:.env[.properties]
//////////////////////////////////////////////////////
  security:
    oauth2:
      client:
        registration:
          google:
//////////////////////////////////////////////////////
            client-id: ${GOOGLE_CLIENT_ID}
            client-secret: ${GOOGLE_CLIENT_SECRET}
//////////////////////////////////////////////////////

3. .gitignore에 .env 파일 추가

위의 단계를 거치면 git에는 나의 보안 정보를 올리지 않으면서, 프로젝트를 잘 실행시킬 수 있다!

'SPRING' 카테고리의 다른 글

[Spring Security] H2 DB연결 에러 해결 방법  (0) 2024.12.20

1. 구글 OAuth2 로그인을 위해 SecurityConfig를 작성했는데, h2페이지로 연결하려고 보니 문제가 생기는 것을 확인했다...! http의 authorizeHttpRequests에서 인증된 사이트에만 접근할 수 있도록 설정을 해두었기 때문에, 다른 contenxt-path를 적으면 default url로 넘어가게 된다. 이를 방지 하기 위해 requestMatchers에 `h2-console.**` 을 추가해주었다.

        http
            .csrf(AbstractHttpConfigurer::disable)
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/", "/login.html", "/static/**", "/h2-console/**").permitAll()
                .anyRequest().authenticated()
            )

h2-console 페이지로 연결도 되고, test connection도 잘 되어서 문제 해결인 줄 알았는데! connect를 누르니 우울한 표정의 친구들이 나왔다...!

2. `localhost에서 연결을 거부했습니다` 라는 메시지는 브라우저에서 보안정책에 의해 H2 콘솔이 iframe으로 로드되지 못할 때 발생하는 경우가 많다고 한다. 아무튼 위의 문제를 해결하기 위해서 Frame Options와 Same-Origin Policy의 작동 방법을 알아보았다.

Frame Options는 웹 애플리케이션이 다른 사이트나 도메인에서 iframe으로 로드되지 않도록 설정할 수 있는 보안 헤더로 클릭재킹 공격을 방지할 수 있다. 스프링 시큐리티에서는 frame Options의 설정을 `DENY`,`SAMEORIGIN`,`ALLOW-FROM`으로 정의할 수 있다. H2 콘솔은 웹 브라우저에서 iframe 형태로 동작하는데 스프링 부트는 기본적으로 frameOptions의 기본값을 DENY로 설정하기 때문에 FrameOptions 정책을 위반하여 연결을 거부하게 되는 것이다. 구글링을 통해 headers().frameOptions().disable()을 추가하면 에러가 해결된다는 내용을 찾아서 넣었으나, 6.1부터 deprecated되었다는 에러 메시지를 발견하였다. 

3. 현재 애플리케이션이 실행되고 있는 도메인에서는 iframe을 허용할 수 있도록, 즉 frameOptions를 sameOrigin으로 설정해주는 방법으로 해결할 수 있었다.

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(AbstractHttpConfigurer::disable)
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/", "/login.html", "/static/**", "/h2-console/**").permitAll()
                .anyRequest().authenticated()
            )
            .oauth2Login(oauth2 -> oauth2
                .loginPage("/login.html")
                .defaultSuccessUrl("/", true)
            )
            .headers(headers -> headers.frameOptions(FrameOptionsConfig::sameOrigin));
        return http.build();
    }

'SPRING' 카테고리의 다른 글

[Spring] .env 파일로 보안 컨텐츠 삽입  (1) 2024.12.20

+ Recent posts