(항해99) 3주차 주특기 숙련
17 Jul 2022Spring Security
입문 주차 때 비밀번호 암호화 해보겠다고 깝치다가 spring security를 살짝 찍먹했었는데 ㅋㅋ 아아 그것은 아무것도 아니었다.
사실 스프링 시큐리티를 잘 활용하면 로그인폼/로그아웃/인증/인가 다~ 알아서 해주기 때문에 편하지만 우리는 JWT를 사용해야 했다.
무슨 말이냐? 이 스프링 시큐리티를 커스텀해서 써야 한다는 말ㅋㅋㅋ
거기서부터 지옥이 시작되었다.
일단 JWT를 웹미니 프로젝트 때 파이썬으로 경험해봐서 아 그거? 했지만
ㅋ…
강의
사실 무작정 ‘하세요’ 하고 던져지는 건 아니고 강의가 주어지기 때문에 강의를 참고해서 만들면 되지만
그렇게 쉽다면 이렇게 징징대진 않았겠지 ㅋㅋ
강의에서 분명 스프링 시큐리티로 로그인 구현을 했지만 JWT는 잠깐 스쳐지나가는 수준으로 다뤘기 때문에(ㅋㅋㅋ) JWT 할 사람은 참고하세요~ 하는 느낌으로 받은 파일은… 정말 아이고 이게 무슨 일이얔ㅋㅋㅋ
그야말로 멘탈 와르르맨션;;
Anyway
대가리 꺠져가며 ㅋㅋ 코드 뜯어보고, 일일이 test를 하면서 깨달은 부분을 정리해보자면
일단 이건 받은 JWT파일을 킹림판을 활용하여 ㅋㅋ 정리한 건데
JwtTokenUtils에 있는 토큰 정보, 알고리즘으로 인코딩한 시크릿키로 해당 파일의 순서로 JWT(json web token)을 생성하고~ 인증하고~ 인가하고~ 한다는 것이다.
그리고 그 대부분의 기능이 스프링 시큐리티의 인증관리자가 처리하기 때문에 WebSecurityConfigurarAdapter를 상속한 config를 만들어서 처리를 해줘야 한다는 것이다.
아 그리고 스프링 버전이 높으면 해당 어댑터 상속이 밑줄처리 되면서 사용이 안 될 수도 있으니까 버전 확인하고 프로젝트를 생성하고, 이미 만들었어도 빌드에서 수정 가능하니까 괜찮다 ㅋㅋ
힘들었던 부분
아무튼 스프링 시큐리티를 커스텀하는 게 물론 힘들었지만 사실 나는 가장 시간을 허비한 것이 ajax 였다ㅠㅠ
- 인가 문제
애초에 분명 authorizated 되었을 건데 로그인을 해도 해당 페이지에 접근이 거부되는 것이다ㅠㅠ
근데 알고보니 인가 확인을 request.getHeader(“Authorization”)이 null인지 아닌지로 했는데 로그인을 해도 안 해도, token이 있어도 없어도 null로 뜸ㅋㅋㅋㅋㅋ
스프링시큐리티가 접근을 막은 것인지 뭔지 아무튼 ㅠㅠ 그래서 javascript로 ㅋㅋㅋ 쿠키를 체크한 다음에 토큰이 있으면 ajax header에 해당 토큰을 넣어주고 -> ajax로는 인가가 가능해져서 직접 페이지에 접근하는 걸로는 확인할 수 없지만 ㅋㅋㅋ 막아놓은 페이지는 ajax GET으로 하면 error가 response되게 해서 ㅋㅋㅋ 못 들어가게 했다. 꼼수라면 꼼수랄까…
- error 처리
하 정말;; 왜 error가 콘솔에서는 뜨는데 클라이언트에 response되지 않는 거냐고ㅠㅠ
알고 봤더니 스프링시큐리티가 관여하는(로그인 부분-_-) 부분에서의 실패처리는 또 config에서 설정해주고 AuthenticationFailureHandler를 상속받은 핸들러를 만들어서 처리해줘야 하는 거였다-_-
너무한 거 아니냐고ㅠㅠ 일일이 확인받고 보고받아야 되는 인증관리자님;;
그래서 전까지는 과제 해결하는데 크게 어려움이 없었다가 이번에 제대로 대가리가 깨져버렸다 ㅎㅎㅎ;
진짜 과제 제출 못 할 뻔 ㅎㅎ;
실제로 캠프 내에서 이번 과제를 제출하지 못한 분들도 많았고ㅠㅠ 사실상 나도 javascript로 ㅋㅋㅋ 해결해버려서 참…
이것이… 숙련…?