• Home
  • About
    • on Weekend photo

      on Weekend

      ๐™Ž๐™ฉ๐™ช๐™™๐™ฎ๐™ž๐™ฃ๐™œ

    • Learn More
    • Instagram
    • Github
  • Archive
    • All Posts
    • All Tags
    • All Categories
  • Categories
    • Problem Solving
    • TIL
    • Study
    • Etc
    • ํ•„์‚ฌ
  • Projects

[์‚ฝ์งˆ] Srping Security

16 Apr 2021

Spring Security

package com.todolist.todo;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class springSecurityTest extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        super.configure(auth);
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
//        super.configure(web);

        // ACL(Access Control List - ์ ‘๊ทผ ์ œ์–ด ๋ชฉ๋ก)์˜ ์˜ˆ์™ธ URL์„ ์„ค์ •
        web.ignoring().antMatchers("/assets/**"); // ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ๋กœ
        web.ignoring().antMatchers("/favicon.ico"); // favicon.ico๋Š” ๊ฐ€๋Šฅํ•˜๊ฒŒ
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
//        super.configure(http); // ๋ชจ๋“  URL์„ ๋ง‰๊ณ  ์žˆ๋Š” ์ƒํ™ฉ
        http.authorizeRequests()
                .antMatchers("/users/logout").authenticated()
                .antMatchers("/board/write", "/board/delete", "/board/modify").authenticated()
                .antMatchers("/admin/**").hasAuthority("ROLE_ADMIN")
                .anyRequest().permitAll();
    }
}

์œ„์™€ ๊ฐ™์€ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•˜์—ฌ Spring Security๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” localhost๋กœ ์ ‘๊ทผํ–ˆ์„ ๋•Œ, ๋“ค์–ด๊ฐ€์ž๋งˆ์ž ๊ณ„์† login์œผ๋กœ ๋„˜์–ด๊ฐ”์—ˆ๋Š”๋ฐ์š”. ์œ„์˜ ์„ค์ •์„ ์ ์šฉํ•ด์ฃผ๊ณ  ๋‚˜๋‹ˆ ์ด์ œ ์„ค์ •๋œ ๋ถ€๋ถ„(authenticated๋œ ๋ถ€๋ถ„)์€ ๋“ค์–ด๊ฐ€์ง€์ง€ ์•Š๊ณ , ๊ทธ ์™ธ์˜ ๊ฒƒ๋“ค์€ ์ž˜ ๋“ค์–ด๊ฐ€์ง‘๋‹ˆ๋‹ค.

package com.todolist.todo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MainController {

    @RequestMapping("/login")
    public String hello() {
        return "Hello World!";
    }

    @RequestMapping("/test")
    public String test() {
        return "It's test page";
    }

    @RequestMapping("/users/logout")
    public String logout() {
        return "logout";
    }
}

image-20210416011142263

image-20210416011201040

Whitelabel Error Page๋ผ๊ณ  ๋œจ๋Š”๊ฒŒ ์ •์ƒ์ธ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ € url๋กœ ์ ‘์†ํ•˜๋ฉด login ํŽ˜์ด์ง€๊ฐ€ ๋‹ค์‹œ ๋œจ๊ฒŒ๋” ๋ฐ”๊พธ์–ด์ฃผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

http.csrf().disable();

๊ทธ๋‹ค์Œ์€ ์œ„ ๋‚ด์šฉ์„ ๊ธฐ์ž…ํ•˜์˜€๋Š”๋ฐ, CSRF๊ฐ€ ๋ญ”์ง€ ๋ชฐ๋ผ์„œ ์ฐพ์•„๋ณด๋‹ˆ, Cross Site Request Forgery ๊ณต๊ฒฉ์„ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์ธก์—์„œ ์ฐจ๋‹จํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ์ด๋ฅผ disableํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ์‹ถ์Šต๋‹ˆ๋‹ค. (์›๋ž˜๋Œ€๋กœ์˜ ํ•ด๊ฒฐ์€ CORS๋ฅผ ์œ„ํ•ด, ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ธํ•˜๊ฒŒ ์ •๋ฆฌํ•ด์•ผ๊ฒ ์ฃ ?)

๋กœ๊ทธ์ธ ์„ค์ • ๋„์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ

// 2. ๋กœ๊ทธ์ธ ์„ค์ •
        http
                .formLogin()
                .loginPage("user/login") // ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ URL
                .loginProcessingUrl("/user/auth")
                .failureUrl("/user/login?result=fail")
                .defaultSuccessUrl("/", true)
                .usernameParameter("email") // ๋กœ๊ทธ์ธ ์š”์ฒญ ์‹œ id์šฉ ํŒŒ๋ผ๋ฏธํ„ฐ. email, id, name ๋“ฑ ๋ฌด์—‡๋„ ์ƒ๊ด€ ์—†๋‹ค๊ณ  ํ•œ๋‹ค.
                .passwordParameter("password");

Error creating bean with name 'springSecurityFilterChain' ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์—๋Ÿฌ ๋ฐœ์ƒ. ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์—๋Ÿฌ ์ด๋ฆ„ ๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ์—์„œ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์„ ๋ฐœ๊ฒฌํ•จ.

  • ์‹œ๋„1. getter์™€ setter๊ฐ€ ๋ชจ๋‘ ์ž˜ ๋“ค์–ด์žˆ๋Š”์ง€? : ์ž˜ ๋“ค์–ด์žˆ์—ˆ์Œ.
  • ์‹œ๋„ 2. http.antMatchers(โ€œโ€) ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ•จ. ์™œ๋ƒํ•˜๋ฉด SpringSecurityFilterChanin์€ ํŒจํ„ด์ด empty/null์ด๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์ž„. -> ๋‚ด ์ฝ”๋“œ์—๋Š” ๊ทธ๋Ÿฐ ๋‚ด์šฉ์€ ์—†์—ˆ์ง€๋งŒ, SpringSecurityFilterChain์ด ๋ฌธ์ œ์ธ ๋“ฏ ํ•˜์—ฌ ๊ผผ๊ผผํ•˜๊ฒŒ ํ•„ํ„ฐ์ฒด์ธ ๋ถ€๋ถ„๋“ค์„ ์ฝ์–ด๋ณด๋‹ˆ /user/login์œผ๋กœ ์ ํ˜”์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด user/login์œผ๋กœ ์ ํ˜€์žˆ์—ˆ์Œ. ์•„๋ฌด๋ž˜๋„ ๊ทธ๋Ÿฌ๋ฉด ์กด์žฌํ•  ์ˆ˜ ์—†๋Š” url์ด๋ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋“ฏ? ๊ณ ์น˜๋‹ˆ๊นŒ ์ž˜ ๋Œ์•„๊ฐ”๋‹ค.

H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ถ”๊ฐ€

H2๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ Spring Security ๊ณต์‹ ๋ฉ”๋‰ด์–ผ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ Configruation์„ ์ˆ˜์ •ํ•ด๋‹ฌ๋ผ๊ณ  ใ…Ž๋‚˜๋‹ค.

  1. Allow all access to the url path /console/*
  2. Allow all requests to the root url
  3. Disable CRSF
  4. Disable X-Frame-Options in Spring Security

image-20210416020749823

์š”๋ ‡๊ฒŒ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  application.properties์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ค์ •์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

์‚ฌ์‹ค h2-console์ด ๋””ํดํŠธ๋ผ๊ณ  ํ•˜๊ธฐ๋Š” ํ•˜๋Š”๋ฐ, ์ „ ์ด์ „์— ์ฝ์€ ๊ณต์‹๋ฌธ์„œ์—์„œ๋Š” console๋กœ ์ ‘์†ํ•˜๋ผ๊ณ  ํ•ด์„œโ€ฆ ํ˜น์‹œ ๋ชจ๋ฅด๋‹ˆ h2-console์ด๋ผ๊ณ  ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์ฃผ๊ณ  ๋‹ค์‹œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋Ÿฐํ•ด๋ณด๋ฉด,

image-20210416022015034

์š”๋ ‡๊ฒŒ ๋”ฑ ๋œน๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ์„ค์ •์„ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์„ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

image-20210416022405001

๋„ค์— ์ž˜ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

DAO๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋‹ˆ jpa๋ฅผ gradle์— ์ตœ์ดˆ์— ๋„ฃ์ง€ ์•Š์€ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•ด ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. (๋„ฃ์–ด์ฃผ์‹  ํ›„์—๋Š” ๊ผญ refresh ํ•ด์ฃผ์…”์•ผํ•ฉ๋‹ˆ๋‹ค.)

image-20210416022841067

์ถ”๊ฐ€ ๊ณต๋ถ€

CSRF
  • CSRF : Cross Site Request Forgery. ์ธํ„ฐ๋„ท ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์˜์ง€์™€๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ํ–‰์œ„(์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ๋ก ๋“ฑ)๋ฅผ ํŠน์ • ์›น์‚ฌ์ดํŠธ์— requestํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ณต๊ฒฉ
  • ํฌ์ƒ์ž์˜ ๊ถŒํ•œ์„ ๋„์šฉํ•˜๊ณ  ์ค‘์š” ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๊ฒŒ ํ•จ. (ex. ํŽ˜์ด์Šค๋ถ ํฌ์ƒ์ž์˜ ๊ณ„์ •์œผ๋กœ ๊ด‘๊ณ ์„ฑ ๊ธ€ ์˜ฌ๋ฆฌ๊ธฐ)
CSRF์— ๋Œ€ํ•œ ๋ฐฉ์–ด
  1. Referrer ๊ฒ€์ฆ : ๋ฐฑ์—”๋“œ ๋‹จ์—์„œ request์ด referrer์„ ํ™•์ธํ•˜์—ฌ ๋„๋ฉ”์ธ์ด ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆ. (๋Œ€๋ถ€๋ถ„์„ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.)
    • Referrer : A ์‚ฌ์ดํŠธ์—์„œ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ B ์‚ฌ์ดํŠธ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ, ์›น๋ธŒ๋ผ์šฐ์ €๋Š” B ์‚ฌ์ดํŠธ์— ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด์„œ HTTP ํ—ค๋”์— A์‚ฌ์ดํŠธ์˜ URL์„ ๊ฐ™์ด ์‹ค์–ด ๋ณด๋‚ธ๋‹ค. ์ด๋Ÿฌํ•œ URL์„ Referrer์ด๋ผ๊ณ  ๋ถ€๋ฆ„. (๋’ค๋กœ ๊ฐ€๊ธฐ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ์ด์ „ ์‚ฌ์ดํŠธ๊ฐ€ ์ €์žฅ๋˜๋Š” ์›๋ฆฌ์ธ ๊ฒƒ ๊ฐ™๋‹ค.)
  2. Security Token ์‚ฌ์šฉ (CSRF Token) : ์‚ฌ์šฉ์ž ์„ธ์…˜์— ์ž„์˜์˜ ๋‚œ์ˆ˜ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ๋งˆ๋‹ค ํ•ด๋‹น ๋‚œ์ˆ˜ ๊ฐ’์„ ํฌํ•จ์‹œ์ผœ ์ „์†กํ•จ.
    1. Double Submit Cookie ๊ฒ€์ฆ : Security Token์˜ ํ•œ ์ข…๋ฅ˜๋กœ ์„ธ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ. ์›น ๋ธŒ๋ผ์šฐ์ €์˜ Same Origin ์ •์ฑ…์œผ๋กœ ์ธํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํƒ€ ๋„๋ฉ”์ธ์˜ ์ฟ ํ‚ค๊ฐ’์„ ํ™•์ธ/์ˆ˜์ •ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์„ ์ด์š”ํ•œ ๋ฐฉ์–ด ๊ธฐ๋ฒ•์ด๋‹ค. ์„œ๋ฒ„๋‹จ์—์„œ๋Š” ์ฟ ํ‚ค์˜ ํ† ํฐ ๊ฐ’๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํ† ํฐ ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” ์ง€๋งŒ ๊ฒ€์‚ฌํ•˜๋ฉด ๋จ.
      • Same-Origin Policy ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ… : ์–ด๋–ค ์ถœ์ฒ˜์—์„œ ๋ถˆ๋Ÿฌ์˜จ ๋ฌธ์„œ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‹ค๋ฅธ ์ถœ์ฒ˜์—์„œ ๊ฐ€์ ธ์˜จ ๋ฆฌ์†Œ์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œํ•œํ•˜๋Š” ๋ณด์•ˆ ๋ฐฉ์‹. ํ”„๋กœํ† ์ฝœ, ํ˜ธ์ŠคํŠธ, ํฌํŠธ๊ฐ€ ๋™์ผํ•œ ์„œ๋ฒ„๋กœ๋งŒ ajax ์š”์ฒญ์„ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ •์ฑ…์„ ์˜๋ฏธํ•œ๋‹ค.
      • CORS(Cross-Origin Resource Sharing) : ์ถ”๊ฐ€ HTTP ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•œ ์ถœ์ฒ˜์—์„œ ์‹คํ–‰์ค‘์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์„ ํƒ๋œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋„๋ก ํ•˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜. ์ž์ฒด์™€ ๋‹ค๋ฅธ ์ถœ์ฒ˜(๋„๋ฉ”์ธ, ํ”„๋กœํ† ์ฝœ, ํฌํŠธ)๋ฅผ ๊ฐ€์ง„ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ cross-origin HTTP ์š”์ฒญ์„ ์‹คํ–‰ํ•จ. (Same-Origin Policy์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ •์ฑ…). ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ์˜ ajax์š”์ฒญ์ด๋”๋ผ๋„ ์„œ๋ฒ„ ๋‹จ์—์„œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ—ˆ์šฉํ•˜๋Š” ์ •์ฑ…
      • CORS๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ํ•œ ๋ฒˆ ๊ฒช์—ˆ๋˜ ๋ฌธ์ œ์ž„. FE ์„œ๋ฒ„ ๋‹จ๊ณผ BE ์„œ๋ฒ„ ๋‹จ์ด ๋‹ค๋ฅด๋‹ค๋ณด๋‹ˆ CORS๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ FE์—์„œ BE ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ๋ชปํ•˜๋Š” ์ผ์ด ๋ฐœ์ƒํ–ˆ์—ˆ์Œ. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๋จน๊ตฌ๊ตฌ ํ•ด๊ฒฐ์ฑ…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋„๋ฉ”์ธ์„ ์—ด์–ด๋‘์—ˆ์—ˆ๋‹ค.. ใ…Žใ…Ž;

References

Spring Security ๊ธฐ๋ณธ

Referrer์ด๋ž€?

Spring Framework & H2 Database ๊ณต์‹ ๋ฉ”๋‰ด์–ผ

Spring Boot & H2



springjavasecurity Share Tweet +1