묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
인증 컨텍스트 - SecurityContext / SecuriryContextHolder - 2
강의 13분 50초를 보면this.securityContextHolderStrateget.setContext(context);this.securityContextRepository.saveContext(context, request, response);두 메서드가 존재합니다.전자는 ThreadLocal에 인증객체를 저장한다라고 하셨고,후자는 세션에 저장한다라고 설명해주셨는데 개인적으로 잘 이해가 안갑니다. 차이가 무엇인지...
-
해결됨스프링 프레임워크는 내 손에 [스프1탄]
UsernamePasswordAuthenticationToken 생성에 대해서 질문이 있습니다.
새로운 Authentication 생성시에,public Authentication createNewAuthentication(Authentication currentAuth, String username) { UserDetails newPrincipal = this.loadUserByUsername(username); UsernamePasswordAuthenticationToken newAuth = new UsernamePasswordAuthenticationToken(newPrincipal, currentAuth.getCredentials(), newPrincipal.getAuthorities()); newAuth.setDetails(currentAuth.getDetails()); return newAuth; }위 코드에 관하여 질문드립니다.currentAuth.getCredentials()는 현재 SecurityContext에 있는 Authentication의 비밀번호를 가져와서 newAuth생성에 쓰임으로 알고있는데요.이 때, 비밀번호를 수정한 경우에는.. newPrincipal.getCredentials() 라고 고친 메서드를 써야할까요?아니면 Authentication을 바꿔서 유지해주기보다 로그아웃시켜서 다시 로그인해주는 방식이 옳을까요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Dip, @transactional
안녕하세요! 강의를 듣고, 궁금증이 생겨서 찾아보던 중 명확한 답을 얻지 못해서 질문드립니다!.첫째로 DIP에 관련된 질문입니다.회원가입과 비밀번호 암호화 강의 중 "DTO를 서비스 계층으로 바로 넘기는 게 좋지 않다"고 하셔서 궁금증을 가지고 찾아보던 중에이 질문을 보고 관련 내용들을 찾아봤지만, 궁금증을 완전히 해결하지 못해서 질문드립니다.public class Auth ControllerAuthController { private final Auth ServiceAuthService auth ServiceauthService; private final ?AppConfig ?appConfig; @Post MappingPostMapping("/APIapi/auth/signup") public void signup(@Request BodyRequestBody Signup signup) { auth ServiceauthService. signup(signup).signup(signup); }}위와 같은 코드가 있을때 DIP를 지키면서 코딩한다면 단순히 Controller -> Service로 넘기기 위한 전달용 DTO를 만들어서 사용하시는지 궁금합니다.두 번째로 @transactional에 관한 질문입니다.데이터의 수정 및 변동이 있는 부분에는 @transactional을 붙이는 것이 좋다고 들어왔습니다. 그런데 강의의 코드에서는 붙인 부분과 안 붙인 부분이 나뉘는데 특별한 이유가 있을까요?또 한 readonly 속성은 데이터를 읽기만 하는 부분에서는 성능에 도움이 된다고 들었습니다.위의 내용들로 데이터의 변동이 일어나는 부분엔 @transactional을 붙이고, 읽어오기만 하는 부분에는 readonly 속성을 습관적으로 붙여왔는데 호돌맨님 께서는 @transactional을 사용하는 기준(?) 같은게 있으실까요?긴 질문 읽어주셔서 감사합니다 :)
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
SecurityContextRepository부분 질문 있습니다
강의자료 95 page에는 커스텀 한 인증 필터를 구현할 경우 securityContext.saveContext()를 명시적으로 작성해야 된다고 적혀있는데 해당 부분은 OncePerrequestFilter 를 통해 완전 처음부터 작성한 커스텀 필터일 경우이고 이번 강의에서는 AbstractAuthenticationProcessingFilter를 상속받고 그 내부에서 successfulAuthentication 을 통해서 saveContext() 가 작동한다고 이해했는데 맞을까요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
[vite] http proxy error: /auth/login
당연히 구글링 해보셨져? 원하는 결과를 못찾으셨나요? 어떤 검색어를 입력했는지 알려주세문제가 발생한 코드(프로젝트)를 Github에 올리시고 링크를 알려주세요. // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue(), vueJsx(), vueDevTools()], resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) } }, server: { port: 5000, proxy: { '/api': { target: 'http://localhost:8080', rewrite: (path) => path.replace(/^\/api/, '') } } } })function dologin() { axios .post('/api/auth/login', state.login) .then((response) => { // 로그인 성공 시 처리 console.log('로그인 성공:', response.data) // 추가적인 로직 (예: 리다이렉션, 사용자 정보 저장 등) }) .catch((error) => { // 로그인 실패 시 처리 console.error('로그인 실패:', error.response ? error.response.data : error.message) // 사용자에게 에러 메시지 표시 등 }) }post 요청시 계속해서 인터넷에 라고 계속해서 오류가 나옵니다.그래서 이전에 호돌맨님께서 알려주신 방법들을 사용하여hostname을 통해 이름가져오기공인아이피 주소 사용하기방화벽8080 이용해서 연결해주기또한 버전이 문제가 될수있다고 구글링에 나와 시도해보았지만 여전히 계속해서 이오류로 인해 해결이 되지않습니다. 저는 우선 호돌맨님의 방식대로 코드를 짜고 있는중이라 처음 코딩을 클론 코딩을 통해 방식을 배우고 다시한번 영상을 보면서 저만의 포폴을 만들려고 하는중에 문제가 발생했습니다./. https://github.com/CryingPerson/blog제깃 코드입니다ㅠㅠ 살려주세요..
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
커스텀 AuthenticationProvider 구현 질문
저번시간에 커스텀 UserDetailsService를 만들고 이번에 커스텀 AuthenticationProvider를 만드는데 커스텀 AuthenticationProvider는 왜 만드는건가요? 커스텀 UserDetailsService는 저희가 이번 프로젝트에서 유저 객체를 db와 연동하기 때문에 구현을 안하면 제대로 작동하지 않아서 반드시 만들어야 하는데, 커스텀 AuthenticationProvider는 만들지 않아도 저번시간마지막에 보면 로그인 인증이 제대로 되는데 왜 만드는건가요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
AccountDto 생성 이유
지금 생성한 AccountDto는 Account 와 모든 필드가 동일한데 무슨 이유로 만든건가요? 보통 Dto는 Entity 객체와 응답하거나 받을때 필드가 달라서 그럴때를 위해 만드는걸로 아는데 지금 만든 두 객체는 필드가 동일한데 뭐하러 만드는지 모르겠습니다.FormUserDetailsService에서 마지막에 return하기전에 account 객체를 AccountDto 타입으로 바꾸면서 하신 말씀이 클라이언트에서 엔티티 객체를 그대로 주지 않기 위해서 라고 하셨는데 지금 FormUserDetailsService는 인증 필터에서 받고 사용하는거라 클라이언트에게 주는게 아니지 않나요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
csrf 토큰 자동추가 질문 있습니다
thymleaf 의 경우에는 form tag가 붙어있고, spring security에 csrf설정이 켜져 있으면 해당 form 에 csrf input 이 hidden으로 추가되고CookieCsrfTokenRepository를 사용할 경우에는 post요청이 아니여도 쿠키를 통해 csrf token을 전달해준다고 이해했는데 제대로 이해한걸까요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
CookieCsrfTokenRepository 방식 질문 있습니다
csrf는 결국 쿠키와 같이 브라우저가 자동으로 추가하는 이유로 발생하는 문제로 이해했습니다. CookieCsrfTokenRepository방식은 csrf 토큰을 쿠키로 전달하고 client 쪽에서 해당 쿠키값을 읽어서 헤더나, 매개변수로 전달하는걸로 이해했습니다. client에서 cookie를 읽기 위해서는 httponly 속성을 꺼야되는데 이러면 보안상으로 취약해진다고 알고 있는데 이러한 점에도 굳이 세션을 놔두고 해당 방식으로 하는 이점이 있을까요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
로그인 하고 나서 GET요청으로 메인페이지 요청
### 로그인 POST http://localhost:8080/auth/login Content-Type: application/x-www-form-urlencoded username=blog&password=1111&remember=1 ### 메인 페이지 GET http://localhost:8080분명 로그인을 하고나면 메인페이지로 잘 넘어가지만localhost / SESSION ZmU5OGQ2ZDEtZjBjZS00NzhiLWI3NDktM2NiNjAxNTYwM2U1 -1 localhost / remember-me YmxvZzoxNzMwMjE1NjY2NzQ5OlNIQTI1Njo2MzBiMmU5ZmMyNzZiYTcxYTY5ZjI4NzYyMjdlODg3NzEyMWNhMmFlZTdlZmM4YTFmNjMxYmFlYjM1YzhhMTll Sun, 29-Sep-2024 16:10:58잘 발급이 된상태에서 GET을 하게되면 자꾸 메인 페이지로 안넘어가고로그인페이지로 넘어가는데 아무리 찾아봐도 잘모르겠습니다...ㅠㅠ 몇시간을 사용했는지 모르겠네요 이거땜시https://github.com/CryingPerson/blog.git깃허브 주소입니다. 도와주세요 호돌맨님 !!! ㅠㅠ
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
GitHub Collaborator 초대 관련
안녕하세요.강의 잘 보고 있습니다.깃허브 Collaborator 초대 부탁드립니다.GitHub Email: pdohyung@gmail.com
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
RememberMeService가 필요한 이유?
안녕하세요. 강의 잘 듣고 있습니다!저의 질문은RememberMe의 존재 이유를 잘 모르겠습니다.로그인이 안풀리게 하려는건가요 ?그러면 세션의 유지시간을 길게 잡을 수 있을 것 같은데, 복잡하게 JSESSIONID와 REMEMBER 조합으로 쓰는 이유가 와닿지가 않네요. 어떠한 이유로 이게 생긴것이고, 어떤 상황에서 유용하게 쓸 수 있을까요?감사합니다.
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
csrf POST 요청 시에 토큰값 넣어도 안되는 경우 확인해보세요
_csrf 파라미터 이름과 값 사이에 공백이 있는지 확인해보세요공백이 있을 경우 아래와 같이 공백을 지우고 다시 시도하시면 정상 작동됩니다### POST request with a header POST http://localhost:8080/csrf Content-Type: application/x-www-form-urlencoded _csrf=6LGfk2d_v1r5vsNT5VxTiI_8HIvuqSEMwVrVRCCQUXXhiSxyjNSppF5Jjz_Uiftmg3FnurzEMbONyhkhpD-wfROnYUTUuE5E
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
제가 이해를 제대로 했는지 궁금해서 질문드립니다
클라이언트 응답후 SecurityContextHolder는 계속 clear된다고 이해했습니다. 그럼 결국 Session에는 SecurityContext 가 저장되서 유지되는거고, 인증이 필요할때 해당 Session에서 SecurityContext를 꺼내 해당 요청동안에 SecurityContextHolder에 저장해서 사용한다고 이해하면 될까요?
-
미해결코드로 배우는 스프링 웹 프로젝트 - Intermediate
스프링6버전에 톰캣10에서 스프링시큐리티 문제
스프링6버전에 톰캣10으로 진행하고있습니다. 스프링시큐리티부분에서 똑같이해도 에러가 발생하는데스프링6버전에서는 설정이 달라지나요??
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
RoleHierarchyImpl 관련 deprecated 이슈로 인한 수정 코드 기록
Spring security 6.3.3 버전에서 setHierarchy와 생성자인 RoleHierarchyImpl()가 deprecated 되어 공식문서 권장 방법으로 수정한 코드를 남깁니다.전) 이전 방식@Bean public RoleHierarchy roleHierarchy() { RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl(); roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_DB\n" + "ROLE_DB > ROLE_USER\n" + "ROLE_USER > ROLE_ANONYMOUS"); return roleHierarchy; } 후) 정적 메소드 fromHierarchy 사용@Bean public RoleHierarchy roleHierarchy() { return fromHierarchy("ROLE_ADMIN > ROLE_DB\n" + "ROLE_DB > ROLE_USER\n" + "ROLE_USER > ROLE_ANONYMOUS"); }
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
세션 질문입니다.
사용자가 웹에 접속하고 로그인도 안했는데 세션이 왜 생기는건가요? 지금까지 이전 강의에서는 로그인 인증에 성공하면 그때 서버에서 세션을 생성하고 저장한다고 배웠던거 같은데 그냥 접속만 해도 서버에서 클라이언트에 왜 세션을 주는건지 모르겠습니다.
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
provider가 선택되는 정확한 기준을 잘 모르겠습니다
두번째 방식이 CustomProvider에 의해 처리가 되는 것이 이해가 되지 않습니다.첫번째 방식과 단지 CustomProvider를 추가한 것만 다르다고 생각하는데 이로 인해 해당 CustomProvider가 선택된것인가요?아니면 Dao방식은 parent에 존제하기 때문에 현재 list에 존제하는 custom방식이 채택된거라고 이해하면 될까요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
강의 20분13초 내용 질문입니다.
requestMatchers("/login").permitAll()로 /login에 대한 요청은 인증이 필요없게 설정했는데, .formLogin()을 설정하고 나서 "/login" 요청이 formLogin 방식의 필터에 걸리는 건가요?formLogin() 설정을 해도 이미 위에서 equestMatchers("/login").permitAll() 로 /login 에 대한 요청은 인증이 필요없으므로 필터에 걸리지 않고 바로 컨트롤러 PostMapping("/login")으로 가야되는거 아닌가요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
클라이언트마다 별도의 쓰레드 할당 질문입니다.
클라이언트마다 별도의 쓰레드가 할당되고 각 쓰레드별로 쓰레드로컬을 가지고있어 여기에 인증객체를 가진 SecurityContext가 저장된다고 설명해주셨습니다. 근데 제가 알기로 같은 사용자더라도 서버에 요청할때마다 다른 쓰레드가 할당되는걸로 아는데 아닌가요? 맞다면 같은 사용자이더라도 요청할때마다 별도의 쓰레드가 할당되므로, 이전 요청에서 로그인인증을 통해 저장했던 SecurityContext는 사용하지 못하는거 아닌가요?