반응형

스프링 씨큐리티 권한으로 컨트롤러 접근을 체크하긴 했지만 별도의 권한 체크가 필요 AOP를 사용하기로 했습니다.

* 조건 *
1. 씨큐리티 권한이 아닌 다른 조건으로 권한 체크 필요
2. 컨트롤러 중 일부 컨트롤러에만 적용 필요
3. 컨트롤러에 어노테이션으로 해당 컨트롤로 권한을 체크 하기로.

1. 어노테이션 인터페이스 생성

package chsoft.frontend.baseprj.framework.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 사용자 체크용 ApiController Annotation
 * 	- OO고객인 경우 확인하여 접근 금지.
 * 	- 사용예1) @DemoUserCheck
 *             	- "OO고객은 사용하실 수 없는 기능입니다." 기본 메시지 출력
 *  - 사용예2) @DemoUserCheck(message="메시지")
 *  			- message 내용 출력
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface DemoUserCheck {
	String message() default "OO고객은 사용하실 수 없는 기능입니다.";
}

2.  어노테이션 체크 AOP

/**
 * DemoUserCheck 어노테이션 체크 AOP
 *	- OO회원은 접근 할 수 없도록 체크 합니다.
 */
@Aspect
@Component
public class DemoUserCheckAspect {
	protected final Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Autowired CommonService commonService;
	
	@Before("@annotation(chsoft.frontend.baseprj.framework.annotation.DemoUserCheck)")
	public void demoUserCheckAnnotation(JoinPoint joinPoint) {
		
		// 어노테이션 정보 획득
		MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
		DemoUserCheck demoUserCheck = methodSignature.getMethod().getAnnotation(DemoUserCheck.class);
		
		if( demoUserCheck != null ) {
        	if (1==1) {
            	//강제에러..
				throw new chsoft403ForbiddenException("권한이 없습니다.");
            }
		}	
		
	}
}

 

3. 컨트롤러 적용

	/** 등록 */
	@DemoUserCheck
	@PreAuthorize("hasRole('ㅋㅋㅋㅋㅋ')")
	@PostMapping(value="/등록해보자")
	public UserVO insertData .....

 

 

 

반응형

SameSite 문제 허용 설정

간단한 예로 외부 도메인에서 나의 도메인으로 POST 로 호출 할 경우 기존 나의 도메인 쿠키가 유지되지 않는 문제.
나의 경우문제 : 나의 도메인  -> 외부도메인 팝업 호출 -> 외부도메인에서 나의 도메인에 결과값을 넣어 POST로 호출
      - 이 경우 예전에는 브라우저에 나의 세션쿠키 정보가 남아 있어 누구의 결과값인지 바로 확인가 가능 했으나.
      - 크롬 80? 부터는 외부 도메인에서 POST로  호출지 쿠키 정보가 삭제됨.
              ( SameSite 속성의 기본 값을 "None"에서 "Lax"로 변경한 것 때문)
      - 이로인해 세션쿠키가 새로 발급되어 내가 누구인지를 읽어버림

그래서 외부 도메인의 POST 호출을 허용하긴위해서 SameSite ="None"으로 설정해야 합니다.
예시....

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


	@Bean
	public CookieSerializer cookieSerializer() {
		DefaultCookieSerializer serializer = new DefaultCookieSerializer();
		serializer.setCookieName("SESSION");
		
		serializer.setSameSite("None");
		serializer.setUseSecureCookie(true);
		return serializer;
	}


}

단 : None 설정시 http에서는 적용되지 않고 https(SSL) 적용된 경우만 적용이 된다고 합니다. (localhost는 적용됨)

자세한 사항은 제가 참고 했던 사이트를 확인해 주세요. ^^
아 그리고 부트 2.6 부터는 applications.yml 설정이 가능한 것 같습니다. 
저는 낮은 버전을 쓰고 있고. 버전을 올릴 수 없는 상태라 ^^

https://shanepark.tistory.com/349
 * https://github.com/spring-projects/spring-session/issues/1577
 * https://cublip.tistory.com/336

https://seob.dev/posts/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EC%BF%A0%ED%82%A4%EC%99%80-SameSite-%EC%86%8D%EC%84%B1/

 

Spring security 5.1.x에서 Crossorigin에서 요청시(결제모듈 등..) session cookie('SESSION' value) 초기화로 로그

spring boot를 2.1 이상으로 업데이트 하니(spring security 5.1 이상) lg uplus 결제모듈 호출 후 리턴값 받고나서 계속 로그인이 튕겨서 보니 세션값이 있는 쿠키가 계속 삭제되더라구요.. cors, csrf문제인가

cublip.tistory.com

 

Spring Session과 Cookie SameSite 정책

Intro SpringBoot 1.5 버전에서 2.5 버전으로 마이그레이션 작업이 대부분 완료 되었는데 SAML을 이용한 SSO 로그인 부분에서 굉장히 오래동안 해결하지 못하던 문제가 있었습니다. 분명 해당 부분의 코

shanepark.tistory.com

 

 

반응형

+ Recent posts