인프런 커뮤니티 질문&답변

insu2012.lee님의 프로필 이미지

작성한 질문수

스프링 시큐리티

특정 페이지(JSP)에 대해서, 로그인창 없이 접근 할 수 있는 방법이 있나요?

해결된 질문

작성

·

2.7K

0

안녕하세요.

특정 URL (JSP등) 의 경우, 세션이 없는 경우에, 로그인창 없이 접속 할 수 있는 방법이 있나요?

세션이 없는 경우,

IDP(Indentify Provider)의 로그인 창을 이용해야 하는데요, IDP 로 Redirect 시 브라우져의 Form 방식(Post)으로, 요청을 해야 되는 경우가 있습니다.

이 요청 JSP 에 접근할려고 하는 경우, Spring Security Filter 로 인해, Spring 로그인 창이 나타나서 문제인데요..특정 JSP 의 경우,

세션이 없더라도, Spring 로그인 창 없이, 접속할 수 있는 방법이 있는지 문의드립니다.

감사합니다.

답변 4

0

insu2012.lee님의 프로필 이미지
insu2012.lee
질문자

네...감사합니다...많은 도움이 되었습니다.

0

정수원님의 프로필 이미지
정수원
지식공유자

web.ignoring 같은 경우 일반적으로는 정적 파일들 (css, js, images) 을 요청할 때 스프링 시큐리티 필터를 타지 않도록 사용하는 편입니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{

    @Override

    public void configure(WebSecurity webSecurity) throws Exception {

        webSecurity.ignoring().antMatchers("/css/**", "/js/**", "/images/**");

}

저의 강의에서도 소개 하고 있으니 참조하시면 될 것 같습니다.

위와 같은 상황에서는  permitAll  로 적용해 볼 것을 권해 드립니다.

permitAll 로 적용된 URL 은 인증 및 인가와 상관없이 모든 사용자가 접속할 수 있도록 하는 권한표현식입니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{

    @Override

    public void configure(HttpSecurity http) throws Exception {

        http.antMatchers("/testcompany/ssoIndex.jsp").permitAll()

                 .authorizeRequests().authenticated();

}

0

insu2012.lee님의 프로필 이미지
insu2012.lee
질문자

우선 빠른 답변 감사드립니다.

1. 기본적으로 세션을 이용한 인증방식을 사용하고 있는 상태에서 특정한 URL 로 접속할 경우에 인증 절차 없이

해당 URL에 접근이 가능하게 하는 방법을 의미하는 건가요? 

--> 네, 자체 IDP 로 로그인을 해야 하는데, 자체 IDP 가 referrer 를 체크해서, form Post 로 전달를 해야 합니다.

2. 그래서 제가 Filter 를 추가해서, 

 <filter>

<filter-name>SpProxyFilter</filter-name>

<filter-class>com.testcompany.io.services.sp.filter.SessionMonitoringFilterImpl</filter-class>

<init-param>

<param-name>redirect_url</param-name>

<param-value>http://localhost:8180/testcompany/ssoIndex.jsp</param-value>

</init-param>

<init-param>

<param-name>noCheck_urls</param-name>

<param-value>landing.jsp</param-value>

</init-param>

 </filter>

ssoIndex.jsp 로 redirect 를 해서, IDP 로 form(Post Method) 로 보내고, 싶은데요., 

ssoIndex.jsp 를 접근할때, Spring Security 로그인 창이 나타나서, 문제입니다. 

말씀하신 web.ignoring  를 적용 할 수 있을 까요? 

그리고 permitAll 은 인가(Role)에 대한 것 뿐만 아니라, 인증(로그인창) 도 없이 로그인 하도록 가능한 것인지

궁금합니다.

감사합니다. 

0

정수원님의 프로필 이미지
정수원
지식공유자

먼저 궁금한 점이 있습니다.

1. 기본적으로 세션을 이용한 인증방식을 사용하고 있는 상태에서 특정한 URL 로 접속할 경우에 인증 절차 없이

해당 URL에 접근이 가능하게 하는 방법을 의미하는 건가요?

2. IDP 를 이용하신다는  것은 Oauth 나 OIDC 등을 이용해서 인증 및 인가를 받는 다는 의미이실텐데 

IDP 가 외부(구글, 페이스북 등)가 아닌 자체 인증 서버를 사용하시는 경우인가요?

가장 간단하게는 특정 URL 에는 인증, 인가 과정을 거치지 않고 접속하도록 권한 설정을 하면 되지 않나요?

가령 PermitAll 로 한다든지요

세션을 이용한 인증방식에서 어떤 자원에 접속할 때 세션이 존재하지 않는다면 SecurityContext 에는 Authentication 객체가 없을 것이므로 기본적으로 AuthenticationException 으로 인해 로그인 페이지로 이동하겠지만 해당 URL 에 인증이나 인가를 필요로 하지 않도록 권한을 해제하거나 web.ignoring 등의 기법으로 시큐리티 필터 자체를 skip 하도록 할 수도 있습니다.

만약 불가피한 이유로 이 같은 방식을 사용할 수 있는 여건이 되지 않는다면 스프링 시큐리티에서 로그인창을 띄우는 시점이 언제인지를 파악해서 그 로그인 조건을 타지 않도록 구현한다면  가능하지 않을까 합니다.

가령 인증을 거치지 않고 임의의 경로로 접근을 시도했을 경우 ExceptionTranslationFilter 에서 LoginUrlAuthenticationEntryPoint 를 호출해서 로그인 페이지로 이동하도록 하는데 AuthenticationEntryPoint 인터페이스를 다시 구현해서 특정한 URL 로 접속한 경우 로그인 화면으로 이동하지 않고 IDP 로그인 창으로 리다이렉트 한다든지..

제가 insu2012.lee 님께서 질의하신 내용을 정확하게 이해하고 있는지 확실치는 않습니다.

구현 소스를 올려 주시면 좀 더 명확하게 파악할 수 있을 것 같습니다.