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

암차님의 프로필 이미지
암차

작성한 질문수

스프링부트 시큐리티 & JWT 강의

회원정보를 조회하는 API서버가 따로 있을때 로직 분리

작성

·

502

·

수정됨

0

당연히 웹앱이 API에 요청을 할때도 올바른 대상이 요청하는게 맞는지 별도의 검증이 필요하지만

우선 그건 무시하고 순수히 웹앱의 유저 인증만 생각했을때의 이야기입니다..

 

프론트 역할을 하는

html, css, (바닐라js or jQuery) + spring boot(thymeleaf, spring security) 웹어플리케이션 프로젝트가 있고

회원이 있는지 조회할 수 있는 API 서버(DB와 연결된 spring boot)가 별도로 존재했을때

 

어떤 프로젝트에 어떤 식으로 시큐리티 및 토큰생성 세팅을 해야할지 감이 잘 오지 않습니다..

 

제가 구현하고자 하는건 회원/비회원에 따라

페이지를 동적으로 바꾸거나 (로그인이 로그아웃으로 바뀐다든지)

페이지에 접근을 못하게 하려고 합니다 (마이페이지)

 

제 생각에는 구현내용 둘 다 API를 굳이 갈 필요가 없기 때문에 웹앱단에서 검증이 이루어져야 할 것 같은데 맞을까요..?

 

  1. API는 회원 유무를 조회한 뒤, 존재하는 경우 단순히 유저정보(or 아예 토큰을 만들어서 넘긴다..?)를 웹앱에 넘겨주는 것까지가 역할이고, 따라서 Spring Security는 여기서 필요하지 않다

     

     

  2. 웹앱 프로젝트에 스프링 시큐리티 설정을 한 뒤, 스프링부트단에서 API로부터 전달받은 토큰, 혹은 유저정보를 가지고 인증을 처리한다 (하지만 어떻게..?)

 

이런 흐름이 맞는지 모르겠습니다..

답변 1

0

최주호님의 프로필 이미지
최주호
지식공유자

웹앱 프로젝트에 스프링 시큐리티 설정을 한 뒤, 스프링부트단에서 API로부터 전달받은 토큰, 혹은 유저정보를 가지고 인증을 처리한다

이게 맞아요!!

 

API 인증서버로 로그인 요청을 할때는 당연히 자바스크립트로 요청해야 합니다.

그러면 JWT를 받을 수 있어요.

 

잘받았으면 그 정보를 html, css, (바닐라js or jQuery) 을 사용하고 있기 때문에

JWT를 쿠키에 담아주세요.

 

그리고 다시 자바스크립트 요청이 아닌 일반적인 하이퍼링크 요청이나 FORM태그 요청을 하게 되면 쿠키를 가져가게 될것이고,

spring boot(thymeleaf, spring security) 이 쪽에서는 쿠키에 토큰이 존재하면 세션을 만들어주면 끝납니다.

암차님의 프로필 이미지
암차
질문자

답변 감사드립니다!

혹시

js -> 웹앱컨트롤러 -> 웹앱서비스 -> API요청 후 토큰 전달받음 -> 웹앱세션에 토큰저장 및 헤더에 setCookie로 쿠키를 저장하도록 설정 -> js로 결과 전달

이런 흐름이 안되는 이유가 있을까요..?

여태껏 모든 API 요청을 Java단을 거쳐서 해왔기 때문에 바로 요청하려고 하니 뭔가 어색하네요..ㅋㅋ

최주호님의 프로필 이미지
최주호
지식공유자

js -> 웹앱컨트롤러 -> 웹앱서비스 -> API요청 후 토큰 전달받음 -> 웹앱세션에 토큰저장 및 헤더에 setCookie로 쿠키를 저장하도록 설정 -> js로 결과 전달

 

이 부분을 좀더 명확히 알려주셔야 답변드릴수 있을 것 같아요.

 

js는 무엇이고, 웹앱 컨트롤러는 무엇인지 이 부분만으로는 제가 분석이 안되요

암차님의 프로필 이미지
암차
질문자

안녕하세요 프로젝트때문에 답변이 많이 늦어졌습니다

결론적으로는 어찌어찌 구현하게 되었습니다

 

html+css+js로 구성된 프론트엔드와 자바로 구성된 백엔드가 한 프로젝트에 같이 있는 상황이었고,

모든 요청을 백엔드를 통한 뒤 그 백엔드가 별개의 API 서버로 요청을 보내는 구조였습니다. 거기에 인증서버도 별도였구요..

 

또 웹앱 컨트롤러단에 @ResponseBody가 붙은 메소드와 일반 html을 내려주는 메소드가 혼재되어 있었고,

어떤 페이지는 타임리프를 통해 서버사이드에서 렌더링을 진행하고, 또 어떤 부분은 ajax요청을 통해 클라이언트단에서 렌더링을 진행하는 등 뭔가가 깔끔하게 떨어지지 않는 상황이었습니다.

 

  1. form전송이나 js ajax를 통해 동일 어플리케이션 내 Back단 컨트롤러 호출

  2. Back단에서 API서버로 Rest요청

  3. API서버에서 토큰이 유효한지 인증서버에 확인요청

  4. 문제없으면 요청한 값 웹앱에 리턴, 문제있으면 미리 약속된 HttpStatus 코드를 웹앱에 전달

  5. 웹앱에서 HttpStatus를 보고 문제가 있으면 상황따라 토큰을 만료시키거나 인증서버로 재발급을 요청

  6. 재발급 받은 토큰으로 API에 재요청

 

최종적으로는 이런 식으로 구현하게 되었습니다.

 

구현을 하면서 느낀 점은 토큰을 통한 인증 방식의 경우

리액트같은 온리 프론트만 있는 프로젝트에서 바로 API에 요청을 하거나

스프링을 쓰더라도 컨트롤러가 RestController로서 API로부터 JSON을 받아 그 데이터만 내려주는 형태로

서버사이드 렌더링을 일절 쓰지 않는 경우에 적합한 방식인 것 같다는 생각이 들었는데 제 생각이 맞..을까요..?

암차님의 프로필 이미지
암차

작성한 질문수

질문하기