프로그래밍 일기 — Wildcard Pattern
웹 상에서 특정 API에 대해 접근 권한을 주는 방법
드디어 프로젝트를 시작한지 1주가 지나간다. 나와 나의 팀은 “여행 계획 앱”을 기획했다. 누구나 여행을 하고싶은데, 자신이 가는 곳에 어떻게 여행을 가야하는지 감이 안 잡히는 사람들이, 이미 그 곳에 여행을 다녀온 사람들의 정보를 참조해 본인만의 여행계획을 세울 수 있게하는 것이 앱의 목적이었다. 따라서 특정 지역에 여행을 계획한 누구나 게시물을 올릴 수 있고, 누구나 열람이 가능하며, 이러한 게시물의 내용을 참고하여 누구나 여행 계획을 올릴 수 있다.
이 기획을 실현시키기 위해서 그에 맞는 기능들이 필요한데, 누구나 회원가입없이 게시물을 열람할 수 있게 열어놓는 것이 기획의 한 부분이기도했다. 따라서, GET(읽기)요청에 대한 제한을 풀어줄 필요가 있었다.
우리는 WebSecurityConfig
라는 파일을 통해 특정 URL을 갖는 API요청을 풀어줄 수 있도록 구성했다. 그런데 여기서 궁금증이 생겼다. 이전 과정에서 *
혹은 **
를 써서 requestMatchers()
메서드를 사용해 해당 요청에 대한 제한을 permitAll()
메서드로 풀어주었는데, 과연 여기서 *
및 **
는 어떤 의미일까? 궁금해서 ChatGPT-3에 물어보았다.
그의 답을 정리하자면 아래와 같다.
와일드카드 패턴(Wildcard Pattern)
URL패턴을 일치(matching)시키는데 사용되는 표현식으로써, Spring Security의 antMatchers
에서 활용되며, 대표적으로 *
와 **
가 있다.
Single Wildcard (*)
하나의 경로 세그먼트를 나타낸다. 즉, /api/object/*/subobject
는 /api/object/123/subobject
와 같은 경로를 매칭시킨다. 하나의 세그먼트만을 대체하는 것이다.
/api/object/*/subobject
패턴은 /api/object/
이후에 오는 어떤 값이라도 매칭시킨다.
Double Wildcard(**)
여러 경로 세그먼트를 나타낸다. 즉, /api/object/**
는 /api/object/123/subobject
와 같은 경로를 매칭시키고, /api/object/123/subobject/456
과 같은 더 깊은 임의의 경로에 대해 매칭시킨다.
/api/object/**
패턴은 /api/object/
뒤에 어떤 값이 오더라도 매칭시키며, 그 이하의 모든 하위 경로도 일치시키는 것이다(예: /api/object/123/subobject/456
). 조금 더 깊은 경로에 대해서 매칭을 시키는 것이라 볼 수 있다.
결론
*.permitAll()
은 하나의 경로 세그먼트를 대체한다.**.permitAll()
는 여러 경로 세그먼트를 대체한다.- 일반적으로 보안 규칙을 적용하려는 URL패턴에 따라서 선택하여 사용한다.
참조: