๐Ÿ’ Spring/Spring Security

Spring Security Error Code ๋ณ„ ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌํ•˜๊ธฐ

2022. 6. 21. 23:54
๋ชฉ์ฐจ
  1. 1. EntryPoint, Handler ์‚ฌ์šฉ
  2. 2. Spring Security์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ ์‚ฌ์šฉ
  3. ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ• ๊นŒ์š”?
  4. REFERENCES
๋ฐ˜์‘ํ˜•

Spring boot + Security ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์—๋Ÿฌ ์ฝ”๋“œ ๋งˆ๋‹ค ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์€๋ฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณด๋‹ค๊ฐ€ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์ƒ๊ฐ๋‚ฌ์Šต๋‹ˆ๋‹ค.

1. EntryPoint, Handler ์‚ฌ์šฉ

authenticationEntryPoint, accessDeniedHandler์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•ด๋‹น ์—๋Ÿฌ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

Security Config

/* Security Config */
@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                    // ..
                    .exceptionHandling()
                    .authenticationEntryPoint(new MyAuthenticationEntryPoint())
                    .accessDeniedHandler(new MyAccessDeniedHandler())
                    // ..
        ;
    }

AuthenticationEntryPoint

public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
        response.sendRedirect("/unauthorized");
    }
}

AccessDeniedHandler

public class MyAccessDeniedHandler implements AccessDeniedHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
        response.sendRedirect("/access-denied");
    }
}

Controller ์ฝ”๋“œ ์ถ”๊ฐ€

public class MyErrorController {

    @GetMapping("/unauthorized")
    public String unauthorizedPage() {
        return "/todoList/unauthorized";
    }

    @GetMapping("/access-denied")
    public String accessDeniedPage() {
        return "/todoList/access-denied";
    }
}

๊ฐ ์—๋Ÿฌ ํŽ˜์ด์ง€ ์ƒ์„ฑ (์ƒ๋žต)

ํ•ด๋‹น ์—๋Ÿฌ ๋‚ด์šฉ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

2. Spring Security์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ ์‚ฌ์šฉ

์ฐพ์•„๋ณด๋‹ˆ๊นŒ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ ErrorController ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์—๋Ÿฌ ํŽ˜์ด์ง€๋งˆ๋‹ค ์ผ์ผํžˆ API๋ฅผ ์ƒ์„ฑํ•  ํ•„์š” ์—†์ด ํ•˜๋‚˜์˜ API์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Controller
public class HomeController implements ErrorController {

    /* ๊ตฌํ˜„ ํ•ด์•ผํ•˜๋Š” ๋ฉ”์†Œ๋“œ */
    @Override
    public String error() {
        return "/error";
    }

    /* error๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ */
    @GetMapping("/error")
    public String error(HttpServletRequest request) {
        Integer errorCode = (Integer) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);

        /* Error Code ๋ณ„๋กœ ํŽ˜์ด์ง€ ์ œ๊ณต */
        switch (errorCode){
            case 401:
                return "/unauthorized";
            case 403:
                return "/access-denied";
            case 404:
                return "/not-found";
            default:
                return "/server-error";
        }
    }
}

 

์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ• ๊นŒ์š”?

Spring ๊ธฐ๋ณธ error page

์œ„ Whitelabel Error Page๋Š” BasicErrorController๊ฐ€ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ErrorMvcAutoConfiguration์ด๋ผ๋Š” ํด๋ž˜์Šค์—์„œ BasicErrorController๋ฅผ ๋นˆ์œผ๋กœ ๋งŒ๋“œ๋Š”๋ฐ ์ด๋•Œ @ConditionalOnMissingBean์ด ๋ถ™์–ด์žˆ์–ด์„œ ErrorController๊ฐ€ ์—†์„ ๋•Œ ๋นˆ์œผ๋กœ ๋“ฑ๋ก์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์œ„์—์„œ ErrorController๋ฅผ ๊ตฌํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— BasicErrorController๊ฐ€ ๋นˆ์œผ๋กœ ๋“ฑ๋ก์ด ์•ˆ๋˜์—ˆ๊ณ , ์šฐ๋ฆฌ๊ฐ€ ์„ค์ •ํ•œ ์—๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@AutoConfiguration(before = WebMvcAutoConfiguration.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class })
@EnableConfigurationProperties({ ServerProperties.class, WebMvcProperties.class })
public class ErrorMvcAutoConfiguration {

	// ์ƒ๋žต..
    
	@Bean
	@ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)
	public BasicErrorController basicErrorController(ErrorAttributes errorAttributes,
			ObjectProvider<ErrorViewResolver> errorViewResolvers) {
		return new BasicErrorController(errorAttributes, this.serverProperties.getError(),
				errorViewResolvers.orderedStream().collect(Collectors.toList()));
	}
    
    // ..   
}

REFERENCES

  • https://www.baeldung.com/spring-boot-custom-error-page
  • https://jungguji.github.io/2020/04/15/custom-error-page/
  • https://frontendshape.com/post/bootstrap-5-404-page-examples
  • https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

 

 
๋ฐ˜์‘ํ˜•
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
  1. 1. EntryPoint, Handler ์‚ฌ์šฉ
  2. 2. Spring Security์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ ์‚ฌ์šฉ
  3. ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ• ๊นŒ์š”?
  4. REFERENCES
'๐Ÿ’ Spring/Spring Security' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • CORS์ด๋ž€ ๋ฌด์—‡์ด๊ณ , Spring-boot์—์„œ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•
  • (Deprecated) WebSecurityConfigurerAdapter์— ๋Œ€์‘ํ•˜๊ธฐ
  • 12. JWT ํ† ํฐ Authorization์„ ์œ„ํ•œ ์ปค์Šคํ…€ ํ•„ํ„ฐ ์ƒ์„ฑ
  • 11. JWT ๋กœ๊ทธ์ธ์„ ์œ„ํ•œ UsernamePasswordAuthenticationFilter ์ƒ์†
iseunghan
iseunghan
๊พธ์ค€ํ•˜๊ฒŒ ์—ด์‹ฌํžˆ..
iseunghan
iseunghan

๊ณต์ง€์‚ฌํ•ญ

  • ์–ด์ œ๋ณด๋‹ค ๋‚˜์€ ์˜ค๋Š˜์ด ๋˜๊ธฐ ์œ„ํ•ด ๐Ÿ”ฅ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (260)
    • ๐Ÿ’ Spring (14)
      • ๊ฐœ๋… ๋ฐ ์ดํ•ด (2)
      • Spring ํ•ต์‹ฌ ๊ธฐ์ˆ  (24)
      • Spring REST API (8)
      • Spring MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ  (7)
      • Spring Security (23)
      • Spring in Action (1)
    • ๐ŸŒป JAVA (84)
      • ์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ (20)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ž๋ฃŒ๊ตฌ์กฐ (13)
      • ๋””์ž์ธ ํŒจํ„ด (7)
      • ์ •๋ฆฌ์ •๋ฆฌ์ •๋ฆฌ (43)
      • JUnit (1)
    • ๐Ÿ”– Snippets (3)
      • Javascript (3)
    • โš™๏ธ Devops (22)
      • โ› Git (11)
      • ๐Ÿณ Docker (6)
      • ๐Ÿง Linux (3)
      • ๐ŸŒˆ Jenkins (1)
      • ๐Ÿ“ฌ Kafka (1)
    • ๐Ÿ’ฌ ETC.. (4)
      • ๐Ÿ’ป macOS (2)
    • ๐ŸŒง๏ธ ORM (2)
      • JPA (2)
    • ๐Ÿ Python (1)
    • ๐Ÿ“š Databases (15)
      • ์˜ค๋ผํด๋กœ ๋ฐฐ์šฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ๋ก ๊ณผ ์‹ค์Šต(2ํŒ) (3)
      • RealMySQL 8.0 (8)
    • ๐Ÿ”ฅ Computer Science (5)
      • ๐Ÿ“ก ๋„คํŠธ์›Œํฌ (5)
    • ๐Ÿท๏ธ ํ˜‘์—… (1)
    • ๐Ÿ“œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (38)
      • BAEKJOON\์ˆ˜ํ•™ 1, ์ˆ˜ํ•™ 2 (8)
      • BAEKJOON\์žฌ๊ท€ (5)
      • BAEKJOON\๋ธŒ๋ฃจํŠธ ํฌ์Šค (3)
      • BAEKJOON\์ •๋ ฌ (1)
      • BAEKJOON\๋ฐฑํŠธ๋ž˜ํ‚น (5)
      • BAEKJOON\BFS, DFS (6)
      • BAEKJOON\์ด๋ถ„ํƒ์ƒ‰ (1)
      • BAEKJOON\๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ (9)
      • BAEKJOON\๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ (0)
    • โœจ ISEUNGHAN (1)

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
๋ฐ˜์‘ํ˜•
hELLO ยท Designed By ์ •์ƒ์šฐ.
iseunghan
Spring Security Error Code ๋ณ„ ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌํ•˜๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๊ฐœ์ธ์ •๋ณด

  • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
  • ํฌ๋Ÿผ
  • ๋กœ๊ทธ์ธ

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.