joo-yoon
joo-yoon
JooStory
174 posts
Ubuntu, Dev 관련 끄적이는 곳입니다.
Don't wanna be here? Send us removal request.
joo-yoon · 8 months ago
Text
텀블러 post list summary 만들기
텀블러의 리스트에는 글 전체보기 혹은 제목만 표시하기만 가능하다 뭔가 피드처럼 전���내용을 흐르듯 보여주는 것이 이 텀블러의 스타일인 것 같다. 하지만 나는 리스트에는 요약된 내용만 보이고 들어가면 자세한 내용이 보이도록 하고 싶다. 그래서 그동안 아예 제목만 표시하고 있었다.
오랜만에 돌아와본 텀블러. 이거저거 바뀌었는데 눈에 띄는 부분이 npf를 이제 메인으로 강조한 부분이었다. 테마 변수에도 {NPF} 라는 것이 생겼다. 이걸 javascript로 어떻게 가져오면 요상하게나마 summary 기능이 가능할 것 같았다.
function makeSummaryFromNpf(contentId, npf) {   let content = ""   const img = npf.content.find(it => it.type == 'image')   if (img) {     let imgSrc = img['media'][1]['url']     content = "<div class='npf_row'><div class='npf_col'><img src='" + imgSrc + "' /></div></div>"   }   const summary = npf.content.find(it => it['type'] == 'text' && !it['subtype'])   if (summary) {     let text = summary['text']     if (text.length > 100) {       text = text.substr(0, 100) + "..."     }     content += "<p>" + text + "</p>"   }   document.getElementById(contentId).innerHTML = content }
간단하게 이런 함수를 만들어서 구현해봤는데 나름 괜찮았다. 요정도로만 하고 그냥 써볼란다. 그나저나 텀블러에는 코드블럭같은거 쓸 수가 없네. 마크다운으로 쓰고는 있는데 제대로 나오려나 ;;;
---
안나온다. 아무래도 모바일과의 통일성을 위해서 마크다운으로 써도 다 지워버리는 것 같다. 여기다가는 개발관련 내용은 못쓰겠다. -_- 망했다.
0 notes
joo-yoon · 8 months ago
Text
텀블러를 떠나야하나
오랜시간동안 블로그를 안하기도 해서 이런 고민을 하는게 웃기긴한데 그래도 정들었던 글을 모아둔 곳이 이렇게 변해버려 아쉬움에 몇자 적어본다.
나는 나의 웹사이트를 가지고 싶었다. custom 도메인을 지원하는 곳에 내 둥지를 틀었는데 그게 처음엔 티스토리였고 텀블러를 안 이후에는 이리로 넘어오기를 시도했다.
블로그는 그대로 두었지만 또다른 웹사이트들은 여기에 다 만들었다. 결혼 웹사이트, 커플 블로그 등등 여러가지를 여기에 만들었다. 몇가지 불만이 있었지만 그런대로 만족하며 쓰고 있었다.
그런데 오랜만에 다시 와보니 custom 도메인이 유료화되어 있었다. 자유롭게 붙여 사용하던게 좋았던건데 너무나 아쉽다. 재미로 만든거에 돈을 마구마구 쓸 수는 없어서 이제 더이상 붙일 수도 없다.
물론 텀블러도 돈을 벌어야하니 이해는 하지만 좀 아쉽다. 이미 붙여둔 것은 그래도 계속 유지하겠지만... 돈도 벌면서 너무 공짜만 찾는건가. 뭐 어쨌든 그렇다.
0 notes
joo-yoon · 4 years ago
Text
우분투 메신저
우분투를 이따금 업무용으로 사용하는데. 이때 가장 문제가 되는 점이 메신저다. (회사에서 준 맥은 어디가고 우분투냐고? 그건...) 일단 카톡은 할많하않. 기대를 모았던 카카오 워크는... 맥에서도 쓰지 않는다. 그���고보면 우분투에서 대표적으로 메시징을 할만한 앱이 이제 없다.
예전엔 이런것 저런것 그래도 좀 있었던 것 같은데 모바일로 넘어가면서는 pc 메신저는 거의 신경을 쓰지 않는 분위기다. 요즘 브라우저가 좋아져서 웹에서 메시징이 가능해서 그런가? 페이스북도 그렇고..
Linux | 다운로드
모바일 기기나 데스크톱에 Slack을 무료로 다운로드하세요. iOS, Android, Mac, Windows 및 Linux용 앱으로 대화를 이어나가세요.
slack.com
LINE
부담 없는 무료 메시지, 편리한 메모 기능
chrome.google.com
그래도 이렇게 slack도 베타버전을 내주고 line은 무려 chrome스토어에 출시를 해줬다. 이제 서버 에러메시지도 무지 받아야 하고 github pr도 주고받아야하니 slack이나 써보자고 해볼까...
0 notes
joo-yoon · 5 years ago
Text
Lisp 이해
An Intuition for Lisp Syntax
Every lisp hacker I ever met, myself included, thought that all those brackets in Lisp were off-putting and weird. At first, of course. Soon after we all came to the same epiphany: lisp’s power lie...
stopa.io
Lisp은 왜 저런 구조로 만들어졌나 의아했는데 이 글을 보니 확 이해가 된다. Javascript로 이야기를 시작해서 이게 뭔가 했는데 Javascript로 Lisp형태의 syntax 구현 @.@ 대단하다는 말 밖에는...
0 notes
joo-yoon · 5 years ago
Text
OpenJDK
LINE의 OpenJDK 적용기: 호환성 확인부터 주의 사항까지 - LINE ENGINEERING
2018년 오라클의 라이선스 체계가 변경되면서 2019년 1월 이후 더 이상 무료로 Oracle JDK를 사용할 수 없게 되었습니다. 이에 LINE 내부에서는 사전에 OpenJDK를 적용하기 위해 필요한 사항이나 검토 항목을 정리하기 위하여 TF(task force)를 구성하였고, 진행된 내용과 사용된 기술적인 사항들을 정리하고자 이 글을 작성하게 되었습니다.
engineering.linecorp.com
adoptopenjdk docker 공식 이미지에 hotspot이랑 openj9이 있어서 뭔가 했는데 버전 이름이었다. hotspot은 뭔가 개발버전같은 느낌이라 안썼는데 잘못 알고 있었다.
Difference between JVM and HotSpot?
What exactly is HotSpot and how does it relate to JVM and OpenJDK? Is it a library? What exactly does it do? Also, what is the difference between OpenJDK and HotSpot?
stackoverflow.com
좀 더 자세한 버전.
0 notes
joo-yoon · 5 years ago
Text
gradle 아니 내 무식이 문제였다
남이 만든 프로젝트를 가져다 쓰고 있는데 내 머신에서는 아무런 문제없는 Docker build가 hub에서만 실패했다. 심지어 gradle build 결과물이 없다는 에러였다. 분명히 있는데 이상하다 생각했다. docker hub에 뭔가 문제가 있으리라 생각하며 직접 빌드해서 pull하던 어느날. 도저히 참지 못하고 고쳐보기로 했다.
run은 안되더라도 어떻게든 빌드는 성공하게 해두고서 이미지를 받아다가 들여다봤다. 근데... ㄷㄷㄷ 빌드 결과물이 이상한 것이다. '프로젝트이름.jar'가 아니고 'build.jar'가 들어있었다. gradle에 project 이름을 지정하지 않았던 것이다. 내 IDE가 너무 친절한거고 내가 무지한 거였다.
부끄럽다.
0 notes
joo-yoon · 5 years ago
Text
망사용료
‘넷플릭스법’에 네이버·카카오도 부글부글…왜?
"망 사용료, 국내 CP 부담도 크다"
www.bloter.net
많은 트래픽을 유발하고 있으니 돈을 내라? 사용자에게는 더 많이 더 빨리 사용하시라며 그렇게 광고를 하면서 CP에게는 다른 말을 하고 있다. 너네들��문에 사용량이 너무 많으니 돈을 내란다. 사용자가 망 사용량에 대해서 돈을 내고 ISP도 망 사용량에 대해서 돈을 내고 있는데 그걸 다 쓰면 안되나부다. 쓴 것보다 더 많이 돈을 받아내고 있는데 CP가 그 사용량을 늘리니 사용자에게는 차마 말을 못하겠고 CP에게 그런 헛소리를 하고 있다.
더욱이 이런 법안에 앞장서는 사람이 김경진의원이라는거다. 이제 낙선해서 더이상 볼일이 없겠지만 이 사람은 타다를 망하게하는데 가장 앞장선 사람이다. 말도 안되는 논리를 앞세웠다. 법에서 허용하지 않으니 하면 안된단다. 아니 국회의원이라는 사람이 잘못된 법이면 법을 고칠 생각을 해야지 왜 법타령인가? 검사야? 타다를 망하게 하니 택시가 잘먹고 잘살게 되었나? 결국 돈이 많은 카카오 모빌리티가 택시 회사를 사서 택시소유주랑 대기업인 카카오만 살아남게 해줬다. 택시기사는 똑같고 타다는 망했다.
이번도 마찬가지라고 생각��다. 상식적으로 말이 안되잖아. 더 커보이니까 무조건 막아야해? 그게 약자를 보호하는 일인가? 이걸 막으면 이익을 보는건 통신사들이 만든 OTT wavve뿐이다. 그게 아니고서는 어떻게 이런 불리한 싸움에서 이기겠나. 결국 결론은 모두가 똑같아지고 대기업인 통신사들만 살아남게 된다. 대부분의 스타트업이 CP가 될텐데 이젠 통신사 눈치만 보게 될거다. OTT 스타트업은 꿈도 못꾸게 될거다. 이런 미래를 보지도 못하고 그냥 눈앞에 있는 것만 보는 김경진은 이제 어서 그만 두면 좋겠다.
0 notes
joo-yoon · 5 years ago
Text
네이버 블로그 API 종료
API를 이용한 글쓰기 기능이 종료됩니다
​안녕하세요.네이버 블로그팀입니다. 오늘은 아쉬운 소식 하나 전해드리려 합니다.​5월 6일, API를 이...
blog.naver.com
네이버 블로그 API가 종료된다고 해서 확인해보니 OPEN API가 아니라 MetaWeblogAPI를 종료하는 것 같다. Open API에 대한 이야기는 없지만 사실 종료된다고 해도 과연 정상적으로 사용하는 사람이 있을까?
블로그 글쓰기 개발가이드
NAVER Developers - 블로그 글쓰기 개발가이드
developers.naver.com
네이버의 OpenAPI는 이렇게 생겼다. 글쓰기, 카테고리 조회 이렇게 두개만 제공된다. 뭘 할 수 있을까? 글만 딱 쓸 수 있다. 이미 쓴 글에 대한 수정을 위한 기능도 전혀 없다. 글 조회, 블로그 정�� 조회 같은 것이 없다. 그러니까 내가 쓰고 있는 TistoryEditor 앱에 붙이고 싶어도 붙일 수가 없다. 애초에 스패머한테나 유용한 API였다.
API 제공도 제대로 안했으면서 관리하기 싫으니까 종료하는 느낌이다. 스패머때문에 종료한다고? 그 스패머한테만 기능 차단하면 되잖아. 그리고 검증된 사람한테만 기능 열어주면 되잖아. 관리가 싫어서 종료하는거면서 핑계만 좋다.
0 notes
joo-yoon · 5 years ago
Text
민주당에 바람
"연동형비례제는 죄 없어..'위성정당' 꼼수 쓴 거대양당이 잘못"
(서울=연합뉴스) 김철선 기자 = 제21대 국회의원 선거 결과 '연동형 비례대표제 도입 취지가 무색하다'는 평가가 나오는 가운데 시민사회는 '위성정당'을 창당한 거대 양당을 비판하며 제도 개선을 요구했다. 16일 경제정의실천시민연합(경실련) 주최로 열린 '21대 총선의 의미와 향후 과제' 토론회에서 김형철 성공회대 교수는 "이번 총선 결과에 대해 준연동형
news.v.daum.net
이번 선거의 결과에는 대체로 만족하지만 비례대표에 대해서는 아주 큰 문제가 있다고 생각한다. 분명히 다양한 정당의 정치참여를 위해서 도입한 제도인데 전혀 이렇게 되지 않았다. 큰 두개의 정당이 비례대표를 독식했고 정의당과 같은 작은 정당들은 더 작아지고 말았다. 물론 내가 다른 정당을 지지하거나 한다는 것은 아니지만 그래도 다양한 목소리가 있어야 하는게 아니었을까.
이전에 거대한 두 정당이 쪼개지면서 정말 다양한 정당이 생기는가 싶었다. 이제는 더이상 안철수를 지지하지 않지만 안철수가 말한 다수정당에 대한 이야기에는 크게 공감했다. 국민의당이 어떤 면에서는 성공해서 좋았다. 이제 한쪽이 고집을 부리는 일은 많이 없어지겠구나 생각했다. 하지만 이놈의 정당은 내분이 일어나서 결국 선거철이 돌아오니 원래 정당으로 돌아가고 말았다.
연동형 비례제는 어떻게든 당선되고 싶은 정치인의 이런 행태를 타파할 좋은 제도라고 생각했다. 그런데 위성정당이라는 이런 꼼수를 써서 이 제도를 완전히 무력화시켰다. 제도가 없는거나 마찬가지다. 이점은 꼭 고쳤으면 좋겠다. 이제 민주당이 과반을 넘어서 제도를 결정할 수 있는 힘이 생겼다. 민주당이 이런 문제를 반드시 고쳤으면 좋겠다.
0 notes
joo-yoon · 5 years ago
Text
이게 언론이다
U.S. Coronavirus Testing Hits Milestone but Still Falls Short
The pace of coronavirus testing in the United States has seen a meteoric rise in the past week. But the country still lags in tests relative to its population, despite having the world’s most reported coronavirus cases.
www.nytimes.com
미국에서 트럼프가 한국보다 많은 검사를 하고 있다고 자랑을 하니 뉴욕타임즈가 정말 그런지 인구 10만명당 검사수를 그래프로 보여주면서 설명한다. 근데 이 그래프가 ㅎㄷㄷ하다. 스크롤을 내리면 그래프가 조금씩 바뀌면서 설명을 덧붙인다.
우리나라가 코로나19로 의료시스템은 아주 훌륭하다는 것이 드러났지만 여전히 언론은 쓰레기같다. 그저 정치인 뒤나 봐주고 네이버에서 클릭한번 더 받으려고 난리다. 뉴욕타임즈와 같은 이런 대단한 인터넷 기사를 발행할 수 있다면 사람들이 알아서 찾아 읽고 돈내고 읽으려 할 것이다.
0 notes
joo-yoon · 5 years ago
Text
업무보고
안심번호 마이크로서비스 개발하기
안녕하세요. 당근마켓 플랫폼 개발팀 인턴 Jerry 입니다. 이번에 당근마켓의 안심번호 마이크로서비스를 개발한 이야기를 공유하려 합니다.
medium.com
인턴은 보통 일정이상의 성과를 내야 정규직 전환이 된다. 당연히 자신이 한 일에 대해서 리뷰를 해야하고 그에 대한 평가도 받아야 한다. 이 인턴의 글은 자신의 훌륭한 성과 리뷰로 만들어진 것이며 회사의 업무를 일정부분 공개하는 것으로 회사 홍보와 개인의 홍보를 동시에 이루는 훌륭한 결과물이라고 생각한다.
물론 이런 글을 작성하는 것은 몹시 오랜 시간이 걸리는 어려운 일이지만 무언가 일을 할 때 이런 식으로 리뷰를 해나간다면 나중엔 아주 큰 자산이 될 것 같다. 이또한 본받아야할 좋은 문화인 것 같다.
0 notes
joo-yoon · 5 years ago
Text
월간 업무보고
Visual Studio Code January 2020
See what is new in the Visual Studio Code January 2020 Release (1.42)
code.visualstudio.com
나의 최애 에디터인 vscode는 언젠가부터 업데이트에 대한 내용을 아주 상세히 보여주기 시작했다. 꽤나 자주 업데이트가 되고 있다고 생각했는데 리스트를 보니 그렇지 않다. 매월 업데이트를 하고 있었다. 아니 업데이트를 자주 했지만 월별로 정리만 해둔건가?
어쨌거나 이 업데이트를 보고 있자니 마치 월간 업무보고같은 느낌이 들었다. 아니 이건 상급자에게 보고를 한다고 해도 이렇게는 못할 것 같다. 정말 제품에 대한 깊은 애정이 없다면 이렇게 못했을 것 같다. 스스로 원해서 하는 월간보고. 너무나 멋지다.
나의 제품도 이렇게 보고를 할 수 있으면 좋겠다.
0 notes
joo-yoon · 5 years ago
Text
허무함
어떻게든 Spring Security를 활용해보려고 SecurityWebFiltersOrder.LOGIN_PAGE_GENERATING, SecurityWebFiltersOrder.LOGOUT_PAGE_GENERATING, SecurityWebFiltersOrder.LOGIN_FORM에 해당하는 필터 만들고 ip 받아와서 인증 라이브러리에 넘겨주고 있었는데 ip는 꼭 필요한게 아니라고 하고 사용자 등록에 ip도 없다. -_-
진작 그런거 말해주면 좋았잖아.
지금까지 만든 것은 다 공부한 것으로 생각하고 모두 롤백하기로...
0 notes
joo-yoon · 5 years ago
Text
다 이유가 있다
지저분한 코드에는 이유가 있다. 깔끔하게 코드를 정리하고 나면 오동작하거나 다른 문제가 발생하게 된다. 그러면 왜 그렇게 지저분한 코드가 되었는지 그 코드에서 이유가 드러나야한다. 그렇게 할 수밖에 없는 이유가. 이유를 드러내지 않고 늘어놓으면 이후에 코드를 본 다른 개발자 혹은 이유를 잊어버린 개발자가 이걸 정리하려고 하게 된다. 그러니까 결국 주석을 ���용할 수 밖에 없는 것 같다.
0 notes
joo-yoon · 5 years ago
Text
Spring Security FormLoginSpec이 하는 일
Spring Security는 사용자 인증과 관련된 여러가지 일들을 자동으로 해주는데 그 중에서 FormLogin이 무슨 일을 하는지 정리해보려고 한다.
return http.formLogin() .and().build();
formlogin을 시작하려면 security 설정에서 간단히 formLogin()을 실행하기만 하면 된다. 이것은 ServerHttpSecurity의 formLogin에 FormLoginSpec을 할당하고 build()가 실행될 때 FormLoginSpec의 configure를 실행한다.
configure에서는 ServerHttpSecurity의 defaultEntryPoints에 RedirectServerAuthenticationEntryPoint를 추가하고 ServerHttpSecurity에 SecurityWebFiltersOrder.FORM_LOGIN로 AuthenticationWebFilter를 할당한다.
즉, loginPage가 아닌 페이지에 접근을 하는데 로그인 상태가 아니면 로그인 페이지로 redirect하고 이 로그인 페이지에서의 인증 완료처리를 담당하는 것이다.
이제 이걸 내가 하면 된다. -_-;;; authenticationConverter만 custom이 됐어도 내가 이걸 안해도 되는데...
0 notes
joo-yoon · 5 years ago
Text
Webflux의 spring security formlogin에서 IP 받기
결론부터 말하면 간단히 되지 않는다.
인증에 username, password 외에 IP가 필요하다. 처음엔 ReactiveAuthenticationManager를 수정해서 IP만 받아오면 되겠다고 생각했다. 근데 Reactive가 어디 그런 정보를 어디서 주던가? method 체인으로 받아오지 않으면 안된다. 그래서 이 ReactiveAuthenticationManager의 authenticate를 호출하는 곳은 어디인가 찾아봤다.
그것은 AuthenticationFilter였다. FormLoginSpec은 내부에 ReactiveAuthenticationManager를 가지고 있다가 AuthenticationFilter에게 넘겨주어 SecurityWebFiltersOrder.FORM_LOGIN에서 사용하게 만든다. 아! 이제 찾았군.
filter에서 뭘하는지 보니 ReactiveAuthenticationManagerResolver가 ReactiveAuthenticationManager에게 token을 넘겨주고 있다.
private Mono<Void> authenticate(ServerWebExchange exchange, WebFilterChain chain, Authentication token) { WebFilterExchange webFilterExchange = new WebFilterExchange(exchange, chain); return this.authenticationManagerResolver.resolve(exchange.getRequest()) .flatMap(authenticationManager -> authenticationManager.authenticate(token)) .switchIfEmpty(Mono.defer(() -> Mono.error(new IllegalStateException("No provider found for " + token.getClass())))) .flatMap(authentication -> onAuthenticationSuccess(authentication, webFilterExchange)) .onErrorResume(AuthenticationException.class, e -> this.authenticationFailureHandler .onAuthenticationFailure(webFilterExchange, e)); }
이제 조금만 찾으면 된다. 이 token은 어디서 만드는거지? 아! filter에서 authenticationConverter를 통해서 만드는구나. 거기서 아마 username, password를 파싱해서 token을 만드는거겠군.
@Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { return this.requiresAuthenticationMatcher.matches(exchange) .filter( matchResult -> matchResult.isMatch()) .flatMap( matchResult -> this.authenticationConverter.convert(exchange)) .switchIfEmpty(chain.filter(exchange).then(Mono.empty())) .flatMap( token -> authenticate(exchange, chain, token)); }
이제 다 찾았다고 생각했다. 이제 그 converter만 교체하면 된다. 근데...
protected void configure(ServerHttpSecurity http) { // ... AuthenticationWebFilter authenticationFilter = new AuthenticationWebFilter( this.authenticationManager); authenticationFilter.setRequiresAuthenticationMatcher(this.requiresAuthenticationMatcher); authenticationFilter.setAuthenticationFailureHandler(this.authenticationFailureHandler); authenticationFilter.setAuthenticationConverter(new ServerFormLoginAuthenticationConverter()); authenticationFilter.setAuthenticationSuccessHandler(this.authenticationSuccessHandler); authenticationFilter.setSecurityContextRepository(this.securityContextRepository); http.addFilterAt(authenticationFilter, SecurityWebFiltersOrder.FORM_LOGIN); }
다른 건 다 외부에서 받아와서 넘겨주는데 converter만 new ServerFormLoginAuthenticationConverter()로 넣고 있다. filter마저도 local변수다. 이걸 교체할 방법은? 없다. 직접 SecurityWebFiltersOrder.FORM_LOGIN를 처리하는 filter를 만드는 방법 뿐이다. ㅠㅠ
어디서부터 얼마나 만들어서 넣어야 하는지 이제부터 봐야한다.
0 notes
joo-yoon · 5 years ago
Text
Spring Security 3장 읽기
3장부터는 프로세스 구조를 단순화하기 위해 스프링 부트를 사용한다. 사용하기에 앞서 앱의 사용자 정보를 위한 클래스를 정의한다.
CalendarUser: 사용자
Event: 일정 이벤트
CalendarService: 달력 정보 서비스
UserContext 인터페이스는 SecurityContextHolder를 통해 얻는 사용자 정보다. 스프링 시큐리티는 SecurityContextHolder를 통해 SecurityContext를 얻고 이는 Authentication으로 채워져있다.
UserContext를 상속하는 SpringSecurityUserContext는 SecurityContextHolder와 CalencarService를 사용해 getCurrentUser를 구현한다.
public CalendarUser getCurrentUser() { SecurityContext context = SecurityContextHolder.getContext(); Authentication authentication = context.getAuthentication(); if (authentication == null) { return null; } return calendarService.findUserByEmail(authentication.getName()); }
SecurityContextHolder를 사용한 사용자 로그인
auth.inMemoryAuthentication() .withUser("user").password("user").roles("USER")
여기서 .inMemoryAuthentication()은 InMemoryUserDetailsManager라는 UserDetailsManager의 인메모리 구현체를 생성한다.
스프링 시큐리티에서 사용자를 관리하는 방법:
UserDetailsManager를 UserDetailsService 빈으로 생성
CalendarService.createUser에서 userDao.createUser로 User를 저장
CalendarUser를 UserDetails로 변환하여 UserDetailsManager.createUser로 등록
SpringSecurityUserContext의 setCurrentUser에서 User를 UserDetails로 변환하고 Authentication을 만들어 SecurityContextHolder에 등록한다.
SignupController.signup에서는 form의 정보를 받아 calendarService.createUser를 수행한다.
사용자 정의 UserDetailsService
UserDetailsService를 구현한 CalendarUserDetailsService를 사용해서 CalenderUser를 UserDetails를 변환하면 더이상 사용자를 이중으로 관리하지 않아도 된다. CalendarUserDetailsService.loadUserByUsername을 구현하면 더이상 .inMemoryAuthentication()를 사용하지 않아도 된다.
이제 UserDetails를 상속하고 UserDetails를 구현한 CalendarUserDetails를 사용해서 사용자 정보를 관리한다. authentication.getPrincipal()로 CalendarUserDetails를 가져올 수 있다.
사용자 정의 AuthenticationProvider
스프링 시큐리티는 AuthenticationProvider로 사용자의 인증여부를 결정한다. 스프링 시큐리티가 대부분의 객체를 제공한다. CalendarUserAuthenticationProvider.authenticate에서 사용자 정의 인증을 구현한다. authenticate를 호출하기 전에 supports가 true인지를 확인하여 이 provider 사용여부를 결정하므로 사용하려면 true를 반환하게 해야한다. 이렇게 만든 객체는 SecurityConfig의 auth.authenticationProvider로 등록한다.
AuthenticationProvider는 원하는 매개변수를 사용해 인증할 수 있다. Authentication을 구현한 UsernamePasswordAuthenticationToken을 사용해도 되지만 다른 구현체를 만들 수 있다.
formLogin() 메소드는 스프링 시큐리티에 UsernamePasswordAuthenticationFilter를 사용해 로그인 컨트롤러로 동작하도록 지시했다. filter는 다음과 같은 역할을 수행할 수 있다.
http 요청에서 사용자명과 패스워드를 획득
UsernamePasswordAuthenticationToken 생성
UsernamePasswordAuthenticationToken의 검증 요청
유효성이 검증되면 SecurityContextHolder에 인증결과를 설정
이러한 동작을 하도록 변경한 사용자 정의 AuthenticationFilter를 auth.addFilterAt으로 등록한다.
0 notes