묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
EC2 중지후 재시작시 기존배포 애플리케이션에 대한 문의
EC2 중지후 다시 인스턴스를 실행 했는데 퍼블릭 ip주소가 바꼈습니다.그래서 다시 인스턴스 실행후 바뀐 퍼블릭 ip주소로 접속을 시도했는데보안설정도 그대로인데 접속이 안되서 보니 빌드 디렉토리는 존재하는데빌드 실행이 안된상태이고 어플리케이션도 종료가 되있는 상태였습니다 다시 빌드후 어플리케이션 재실행으로현재는 접속이 가능한 상태이지만 혹시 일레스틱을 사용하지 않는 경우나도메인을 따로 구입하지 않은경우에는인스턴스 중지후 재실행시 항상 이러한 절차를 거쳐야 하는건가요?
-
미해결ARM Cortex-M 프로세서 프로그래밍
xPSR 레지스터 플래그 값 및 기타 질문 드립니다.
안녕하세요. xPSR 레지스터와 기타 궁금한 부분들 질문 드려봅니다!1. mov r0, #0x7fff fffe or mov r0, #0x8000 00020x7fff fffe, 0x8000 0002는 mov 명령어가 invalid constant라고 오류가 나옵니다.강의에서 0x7fff ffff , 0x8000 0000등은 mov 명령어를 썼는데 그것보다 작은 값이 왜 오류인지 궁금합니다. r0 레지스터에 0x7ffffffe 값이 들어있고 adds r0, #1을 한 경우 xPSR(0x1000 0000)이 나왔습니다. Overflow가 되는 상황이 아닌것 같은데 이유가 궁금합니다. Carry가 일어나면 xPSR의 C플래그가 1이 되는데 Borrow는 어떤 경우인지 궁금합니다.작은값에서 큰 값을 빼는 경우 Borrow가 되는건가요? MSB에서 값을 가져올 때에 발생하나요??( 발생하는 예시 하나만 들어주시면 감사하겠습니다) 어셈블리에서 signed unsigned의 구분은 어떻게 이루어지나요?? 이루어지지 않는다면 c언어 한정으로 컴파일러가 변수 타입을 파악하고 자동으로 바꿔주는건가요? 어셈블리 언어는 Arm cortex m3, m4 모두 동일한 명령어를 사용하나요??좋은 강의 해주셔서 감사합니다. 여기서 어셈블리를 더 잘 쓰기에 필요한 책이나 사이트들 혹은 어떤 데이타시트를 봐야하는지 추천 가능하시면 부탁드립니다 ㅎㅎ 고민해보다가 막혀서 안되는 부분과 궁금한 부분 질문 드려봤는데 답변 부탁 드리겠습니다!감사합니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
session
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);첫번째 파라미터 SessionConst.LOGIN_MEMBER는 세션 저장소의 이름 정도로 해석하면 될까요?만약 세션 저장소의 이름이라고 할 때Member loginMember = (Member)session.getAttribute(SessionConst.LOGIN_MEMBER); 는 세션저장소의 이름으로 필요로하는 Member를 찾을 수 있는건가요?? 현재, HttpSession을 저장소, setAttribute를 put정도로 이해하고 있는데 맞는지 확인부탁드립니다!
-
미해결스프링 시큐리티 OAuth2
OAuth2 인가서버로부터 access token 발급 후 저장 관련 질문
안녕하세요 강사님.OAuth2 인가 프레임워크 관련하여 학습 중 인가서버로부터 받은 access token을 어떻게 저장하고 어떻게 활용할 수 있을지 고민하다가 궁금한 점이 있어 질문드립니다. 제가 생각했던 프로세스는 이렇습니다.[리소스 오너가 소셜 로그인 시 (구글인 경우)]리소스 오너가 구글 로그인을 한다.클라이언트 (내가 만든 스프링 서버)는 구글의 인가서버로부터 리소스 오너의 userInfo 엔드포인트 접근 시 사용할 수 있는 access token을 받는다.access token을 활용해서 userInfo 엔드포인트에 접근하여 리소스 오너의 이메일, 이름 등의 정보를 가져온다. (이 부분은 내가 구현하지 않아도 스프링 시큐리티에서 제공)소셜 로그인 시 얻은 정보 (oidc 활성화 시 id-token, 리소스 오너가 허용한 userInfo 등)를 클라이언트의 세션에 저장한다.그리고 로그인 프로세스 완료되어 LoginSuccessHandler에서 이후 로직을 처리할 수 있다. [이후 로그인 된 상태에서 클라이언트의 API 호출 시]클라이언트의 API를 호출할 때 SecurityContextHolder에 userInfo를 담아 활용할 수 있다.access token은 클라이언트에 저장되어 있고, API 호출 시 꺼내어 리소스 서버에 접근할 수 있다. 그런데 SecurityContextHolder에 access token 정보가 보이지 않아 궁금한점이 생겼습니다.만약 로그인이 된 상태에서 userInfo 엔드포인트에 접속 시 매번 새로운 access token을 발급 받아서 요청하는 것일까요? (SecurityContextHolder에 access token이 없어서 조금 헷갈리고 있습니다.)100명의 리소스 오너가 로그인 할 때마다 access token을 발급받으면 총 100개의 access token이 발급되는게 맞을까요?이러한 경우 클라이언트에 100개의 access token을 저장 후 userInfo 엔드포인트 접근 시 사용하며, 만약 만료되었다면 refresh token으로 access token을 재발급 받아 다시 userInfo 엔드포인트에 접근하는게 맞을까요?만약 1개의 클라이언트에 100개의 accessToken을 저장 후 만료 전까지 사용하는 것이라면 클라이언트에 부하가 많이 발생하여 scale-out하는 경우에는 보통 어떻게 해결할 수 있을까요?Google, Naver, Kakao 등의 소셜에서 access token을 발급 받는 것 까지는 스프링 시큐리티가 지원해주지만 이후 다양한 엔드포인트를 호출하거나, access token 만료 시 refresh token으로 재발급 받는 로직 등은 제가 구현해야 하는게 맞을까요? 제가 아직 강의를 절반밖에 듣지 않아서 이후 강의해주시는 부분에 제가 질문드린 내용이 포함되어 있을 수도 있을 것 같습니다. 만약 포함되어 있다면 간략하게나마 어떤 강의 동영상을 참고하면 좋을 지 말씀해주시면 감사하겠습니다.감사합니다.
-
해결됨[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
Missing built-in guistyle ToolbarSeachCancelButtonEmpty 오류 관련 해결 방법 공유
안녕하세요혹시나 저와 같은 오류를 겪고 계신 분이 있을까봐 문제 및 해결 방법 공유드립니다 강사님께서 알려주신 그대로 진행했지만 빌드 옆에 검색창이 없고제목에 적어둔 것처럼 미싱 빌트인~ 오류가 발생했는데요유니티 측에서 search가 아닌 seach라는 사소한 오타를 낸 상태로 업그레이드를 진행하여 생긴 오류로 판단했고, 구글링해보니 저와 같은 오류를 겪고 있는 사람이 꽤 많고 상당히 오래된 오류로 보였습니다.(임의로 해결하는 방법이 여럿있었으나 저에게는 모두 먹히지 않았습니다)최종적인 해결 방법으로는 유니티 에디터 버전을 2021.3.29 -> 2022.2.2로 업그레이드 한 후 해당 프로젝트에서 어드레서블을 검색하여 설치합니다.이렇게 되면 프로젝트 이름/Library/PackageCache 폴더 안에 com.unity.addressables~ 라는 폴더가 생길텐데, 해당 폴더를 지금 작업하고 있는(강사님과 같은 유니티 버전인 2021 에디터)의 프로젝트 이름/Packages에 붙여넣기 합니다.제대로 진행했을 경우 아래 사진처럼 어드레서블(커스텀)이라고 바뀌고아래 사진과 같이 빌드 버튼 옆에 제대로 검색창이 나타나게 되며 콘솔창의 오류 또한 사라집니다.혹시나 저와 같은 오류를 겪고 당황해하는 분들이 계실까봐 공유합니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
피그마 CSS 속성이 안보여요
강의에서처럼 이미지를 클릭해도오른쪽 하단에 css 정보가 안보여요..
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
for반복문 안에 for반복문으로 배열 요소 뽑기
인강 한바퀴 다 듣고 이제 제 개인 프로젝트를 하나 해보고싶어 다시 들으면서 조금 변형시키면서 만드는 중입니다.객체 안에 배열을 하나 넣어뒀는데, 그것을 반복문으로 배열의 요소 만큼 태그를 생성시키고 싶어 이중for문을 사용했는데, characters의 다음요소가 들어가버려서 모양이 이상하게 됩니다.... 이렇게는 아예 못쓰는건가요?character-tag에 css를 설정해두어 없애면 안됩니다.사진이 넘치는건 overflow: hidden을 안했습니다.
-
미해결따라하며 배우는 리액트 A-Z
폐쇄망에서 package 추가
구글링을 해서 폐쇄망에 react 프로젝트를 어찌어찌 설치를 했습니다.정상적으로 실행도 되고 프로그래밍도 가능합니다.근데, 중간에 패키지를 추가하려고 인터넷이 가능한 곳에서 패키지를 추가해서옮겨보려 했으나 잘 안되더군요.폐쇄망에서 패키지 추가는 어떻게 해야 하는지 도움 부탁드립니다.
-
미해결기초부터 따라하는 디지털포렌식
이미지 마운트 실습 중
c드라이브에 있던 걸 usb에 이미징하고 마운트하려고 하는데 f드라이브를 포맷해야 한다고 뜹니다. 어떻게 해야 할까요?
-
미해결[리뉴얼] 타입스크립트 올인원 : Part1. 기본 문법편
[#readonly, #ThisType] 책, 타입스크립트 교과서 문의사항 있습니다
안녕하세요,타입스크립트 교과서를 읽으면 2가지 질문사항이 있습니다.1. " readonly 수식어가 붙은 배열이 더 넓은 타입이다 "2. 3.4 thisType강의와 더불어 책으로도 출퇴근하며 읽는데, 좋은 책 써주셔서 감사드립니다!1. " readonly 수식어가 붙은 배열이 더 넓은 타입이다 "' 2.13 객체 간에 대입할 수 있는 지 확인하는 법을 배우자' 챕터 중" readonly 수식어가 붙은 배열이 더 넓은 타입이다 "let a: readonly string[] = ['hi','readonly'] let b: string[] = ['hi','normal']"어떤 원리로 인해 수식어 'readonly'가 타입의 범위를 더 넓게 만들 수 있는걸까요?"제 생각에서는, readonly일 경우는 읽기전용이라 기능이 '좁고' readonly가 없는 경우는 기능이 많아 '넓고' 라는 생각에서 벗어나질 못하고 있어서요!이펙티브 타입스크립트에서 이와 관련해서 readonly 수식어가 붙은 것을 더 넒은 타입으로 설명하고 있습니다.(readonly 수식어가 넓은타입으로 만들어준다는 내용이 있는것은 아니지만 비슷한 내용이라 추가해봤습니다.)number[ ]는 readonly number[ ]보다 기능이 많기 때문에, readonly number[ ]의 서브타입이다 (이펙티브 타입스크립트, p95)기능이 많고 적음에 따라서, 타입간 포함관계/호환성(타입을 집합으로 이해하고 있습니다)기준은 아니라고 생각하는데요, number[ ]가 readonly number[ ]보다 기능을 더 많이? 갖고 있는걸, readonly number[ ]의 기능(내용)을 extends했기 때문에, number[ ]가 서브타입, readonly number[ ]가 슈퍼타입으로 설명하려는거 아닐까 그렇게 판단했습니다.즉, readonly 수식어가 붙은 경우, 더 넓은 타입, 슈퍼타입이 되는 것과 같은 맥락을 하는데요,슈퍼타입은 서브타입에 비해 일반적이고, 포괄적인 의미라고 이해하고 있는데, 어떻게 제한적인 뉘앙스에readonly 수식어가 타입을 넓혀주는, 즉 타입을 넓게 해주는 역할을 하는건지, 설명이 궁금합니다:] 3.4 ThisTypetype Obj = { data:Data, methods:Methods & ThisType<Data & Methods> }객체 Obj의 타입을 위와 같이 정의하는 코드 중에, 아래 부분 질문 드립니다.methods:Methods & ThisType<Data & Methods> Data는 data객체를 , Methods는 method 객체를 타입 정의한 것,this 객체 타입을 정의하기 위해, 객체 안에 있는 두개의 객체(data객체, methods객체)를 모두 담는 새로운 타입을 정의하기 위해, & 연산자를 사용했다고 이해했습니다.마지막으로 중복된 코드를 사용하지 않기 위해, ThisType이란 유틸리티 타입을 사용한것이라고 이해했습니다.그런데, 다시 Methods를 & 연산자로 다시 병합한 이유가 궁금합니다아래와 같이 그냥 ThisType<Data & Methods> 하지 않고, Methods와 & 연산자로 다시 교집합 하는 의미는 무엇일까요methods:Methods & ThisType<Data & Methods> 이미 ThisType이란 유틸리티 타입으로 타입 Data와 Methods를 정의했는데,다시 Methods를 &연산자와 사용하는걸까요?
-
미해결프로그래밍 시작하기 : 도전! 45가지 파이썬 기초 문법 실습 (Inflearn Original)
주피터 파일제목 만들때 에러가 발생해요
주피터 노트북에서 파일 생성하고 제목 수정할 때, 왜 에러가 발생할까요?ㅜㅠ파일 저장도 안되요ㅠㅠ Autosave failed 라고 떠요
-
미해결지금 바로 React 시작하기
지금 바로 React 시작하기 heart 연습문제
지금 바로 React 시작하기 heart 추가/제거 연습문제1:39초 15번째라인 div안 span 태그속에{heart}라고만 써도 되나요? 동작은 똑같이 됩니다.let heart로 정의가 되어있는데span에서도 다시 정의해서 써야하는건지 궁금합니다!
-
미해결스프링 부트 - 핵심 원리와 활용
외장 Tomcat에서 서블릿컨테이너 초기화 시 오류
안녕하세요~ 김영한 이사님 강의 너무나 재미있게 잘 듣고 있습니다~서블릿컨테이너 초기화를 교육과정에 따라 내장 Tomcat을 이용해서 실행하면 잘 실행됩니다.해당 코드를 외부 서버에 동일한 버전 Tomcat(V10)서버 webapps 폴더에 올려서 실행하면 아래와 같은 오류가 발생하는데 구글링을 해봐도 해답을 찾을 수 없어서 질문 드립니다. 16-Sep-2023 14:42:28.075 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/opt/tomcat/apache-tomcat-10.1.13/webapps/ROOT.war]16-Sep-2023 14:42:28.482 SEVERE [main] org.apache.catalina.startup.ContextConfig.processServletContainerInitializers Failed to detect ServletContainerInitializers for context with name [] java.io.IOException: java.lang.ClassCastException: Cannot cast hello.container.MyContainerInitV1 to jakarta.servlet.ServletContainerInitializer at org.apache.catalina.startup.WebappServiceLoader.loadServices(WebappServiceLoader.java:238)
-
미해결우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)
함수 호출 시 변수 할당
여기서 보면, 10이라고 입력한 매개변수가 알아서 avrager로 할당이 되는데, 이와 관련해서clousre_ex1(10)으로 바로 입력하니 에러가 뜨더라구요.이게 어떻게 작동이 되는지 궁금합니다.아래 다른분이 그다음 예제에 대해 동일한 질문을 하셨는데, 강사님이 아래 링크 참고하라고 하셨는데, 해당 링크에 이와 관련한 자세한 내용이 없더라구요.이게 어떻게 작동이 되는 건가요?풀어서 설명 좀 부탁드립니다.
-
해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
일기 작성이 됐었는데 다시 안됩니다...
두 번 질문해서 답변대로 수정하였더니 일기가 작성이 되었다가..수정 기능을 강의를 보면서 구현을 하였고갑자기 또 일기 작성이 되지 않습니다..다시 여러 번 강의를 보면서 따라했으나 해결하지 못하였습니다..죄송합니다ㅠㅠ코드 샌드박스 링크입니다https://codesandbox.io/s/late-morning-d483sv?file=/src
-
미해결Three.js로 시작하는 3D 인터랙티브 웹
섹션3. 회전 강의에서 reorder 메서드가 잘 이해되지 않습니다.
제가 3D를 잘 몰라서 그런지 강사님이 설명해주신것과 실제 화면상의 결과물이 다소 다르게 보입니다.제가 생각한 것으로는 reorder() 메서드를 사용하면 mesh의 각 면의 x, y, z 방향을 재정리해서 y축 방향으로 45도 돌아간 상태가 새로운 기준이 된다고 생각했는데 몇번 테스트해보면서 써보니 그게 아닌 것 같아요.혹시 reoreder()가 정확히 어떻게 동작하는지 조금 더 자세히 설명해주실 수 있나요?또 reorder() 메서드에서 인자로 줄 수 있는 "XYZ", "YXZ", "XZY" 등등은 무슨 차이가 있는지 궁금합니다.
-
미해결
소셜로그인 accessToken 검증
security에서 OAuth2 클라이언트를 사용해서 구글이나 네이버 api를 사용하지 않고 자동으로 소셜 로그인 accessToken을 검증해주고 정보를 가져올 수 있다는 기능이 있는걸로 알고있어서 gpt에 검색해보니package com.example.social.config.security; import com.example.social.config.jwt.JwtAccessDeniedHandler; import com.example.social.config.jwt.JwtAuthenticationEntryPoint; import com.example.social.config.jwt.JwtProvider; import com.example.social.config.oauth2.PrincipalOauth2UserService; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.DelegatingPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.client.registration.ClientRegistration; import org.springframework.security.oauth2.client.registration.ClientRegistrations; import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest; import org.springframework.security.oauth2.client.userinfo.OAuth2UserService; import org.springframework.security.oauth2.core.AuthorizationGrantType; import org.springframework.security.oauth2.core.OAuth2AuthenticationException; import org.springframework.security.oauth2.core.user.DefaultOAuth2User; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.security.web.SecurityFilterChain; import java.util.HashMap; import java.util.Map; @Configuration @RequiredArgsConstructor @EnableWebSecurity public class SecurityConfig { private final PrincipalOauth2UserService principalOauth2UserService; private final JwtProvider jwtProvider; @Value("${spring.security.oauth2.client.registration.google.client-id}") private String googleClientId; @Value("${spring.security.oauth2.client.registration.google.client-secret}") private String googleClientSecret; @Value("${spring.security.oauth2.client.registration.naver.client-id}") private String naverClientId; @Value("${spring.security.oauth2.client.registration.naver.client-secret}") private String naverClientSecret; @Bean // InMemoryClientRegistrationRepository를 생성하고 반환합니다. // InMemoryClientRegistrationRepository는 OAuth 2.0 클라이언트 등록 정보를 // 메모리에 보관하고 관리하는 데 사용됩니다. public InMemoryClientRegistrationRepository clientRegistrationRepository() { // ClientRegistration 객체를 생성하고 OAuth 2.0 클라이언트의 등록 정보를 설정합니다. ClientRegistration googleRegistration = ClientRegistration .withRegistrationId("google") .clientId(googleClientId) .clientSecret(naverClientSecret) .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .redirectUri("http://localhost:8080/login/oauth2/code/google") // Google의 authorizationUri .authorizationUri("https://accounts.google.com/o/oauth2/auth") .tokenUri("https://oauth2.googleapis.com/token") .scope("openid", "profile", "email") .clientName("Google") .build(); ClientRegistration naverRegistration = ClientRegistration .withRegistrationId("naver") .clientId(naverClientId) .clientSecret(naverClientSecret) .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .redirectUri("http://localhost:8080/login/oauth2/code/naver") // Naver의 authorizationUri .authorizationUri("https://nid.naver.com/oauth2.0/authorize") .tokenUri("https://nid.naver.com/oauth2.0/token") .scope("openid", "profile", "email") .clientName("Naver") .build(); return new InMemoryClientRegistrationRepository(googleRegistration, naverRegistration); } @Bean // OAuth2UserService 타입의 빈을 생성합니다. 이 빈은 OAuth2 로그인 처리에 사용됩니다. // OAuth2UserService는 OAuth2 로그인 후에 사용자 정보를 가져오고 처리하는 인터페이스입니다. public OAuth2UserService<OAuth2UserRequest, OAuth2User> googleOAuth2UserOAuth2UserService() { // new DefaultOAuth2UserService() { ... }: // OAuth2UserService 인터페이스를 구현하는 익명 클래스를 생성합니다. // 이 클래스는 OAuth2 로그인 처리에 사용될 사용자 서비스를 정의합니다. return new DefaultOAuth2UserService() { @Override // loadUser(OAuth2UserRequest userRequest) { ... }: // OAuth2UserService 인터페이스의 loadUser 메서드를 오버라이드합니다. // 이 메서드는 OAuth2 로그인 후에 호출되며, 사용자 정보를 가져옵니다. public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { // super.loadUser(userRequest)를 호출하여 OAuth2 로그인 후에 사용자 정보를 가져옵니다. // OAuth2User 객체는 사용자의 인증된 속성 및 권한을 포함하고 있습니다. OAuth2User user = super.loadUser(userRequest); // OAuth2 로그인 후에 반환되는 OAuth2User 객체를 수정하거나 구성하여 반환합니다. // 여기에서는 사용자의 권한, 속성 및 고유 식별자(sub)를 포함하는 // DefaultOAuth2User 객체를 반환하고 있습니다. return new DefaultOAuth2User( user.getAuthorities(), user.getAttributes(), // 사용자의 고유 식별자 (일반적으로 'sub'라는 속성에 저장됨) "sub" ); } }; } // naver @Bean @Qualifier("naver") public OAuth2UserService<OAuth2UserRequest, OAuth2User> naverOAuth2UserService() { return new DefaultOAuth2UserService() { @Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { OAuth2User user = super.loadUser(userRequest); // 사용자 정보 처리 // user.getName(), user.getAttributes()를 사용하여 필요한 정보를 가져올 수 있음 String uniqueIdentifier = user.getAttribute("id"); return new DefaultOAuth2User( user.getAuthorities(), user.getAttributes(), uniqueIdentifier ); } }; } @Bean public SecurityFilterChain filterChain( HttpSecurity http) throws Exception { http // HTTP 기본 인증 비활성화 .httpBasic().disable() // CSRF(Cross-Site Request Forgery) 공격 방어 비활성화 .csrf().disable() // 폼 기반 로그인 비활성화 .formLogin().disable() // 로그아웃 관련 설정 비활성화 .logout().disable() // 세션 관리를 STATELESS로 설정하여 세션을 사용하지 않도록 설정 // JWT를 사용할거기 때문 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); http .authorizeRequests() .antMatchers("/api/v1/users/**").permitAll(); http // JWT를 위한 Filter를 아래에서 만들어 줄건데 // 이 Filter를 어느위치에서 사용하겠다고 등록을 해주어야 Filter가 작동이 됩니다. // JWT를 검증하기 위한 JwtSecurityConfig를 적용하고 // jwtProvider를 사용하여 JWT 검증을 수행합니다. .apply(new JwtSecurityConfig(jwtProvider)); // 에러 방지 http .exceptionHandling() // 인증 에러 핸들링을 위한 커스텀 JwtAuthenticationEntryPoint 등록. .authenticationEntryPoint(new JwtAuthenticationEntryPoint()) // 권한 에러 핸들링을 위한 커스텀 JwtAccessDeniedHandler 등록 .accessDeniedHandler(new JwtAccessDeniedHandler()); // OAuth2 http // oauth2Login() 메서드는 OAuth 2.0 프로토콜을 사용하여 소셜 로그인을 처리하는 기능을 제공합니다. .oauth2Login() .clientRegistrationRepository(clientRegistrationRepository()) // OAuth2 로그인 성공 이후 사용자 정보를 가져올 때 설정 담당 .userInfoEndpoint() // OAuth2 로그인 성공 시, 후작업을 진행할 서비스 .userService(principalOauth2UserService); // http // // Spring Security에게 OAuth2 리소스 서버를 설정하도록 지시하는 부분입니다. // // 즉, 이 설정 아래에서 JWT를 검증하는 데 필요한 구성을 수행합니다. // .oauth2ResourceServer() // // OAuth2 리소스 서버가 JWT 토큰을 사용한다고 알려줍니다. // // Spring Security에 JWT 검증을 수행하도록 설정합니다. // .jwt() // // JWT 디코더를 설정합니다. // // JWT 디코더는 JWT 토큰을 검증하고 내용을 추출하는 데 사용됩니다. // .decoder(this.jwtDecoder()); return http.build(); } @Bean PasswordEncoder passwordEncoder() { String idForEncode = "bcrypt"; Map<String, PasswordEncoder> encoders = new HashMap<>(); encoders.put(idForEncode, new BCryptPasswordEncoder()); return new DelegatingPasswordEncoder(idForEncode, encoders); } // JWT 디코더를 생성하는 메서드를 정의합니다. // Google의 공개 키를 가져와 JWT 토큰의 서명을 검증하기 위해 사용합니다. // withJwkSetUri 메서드를 통해 Google의 공개 키를 가져오는 URI를 지정합니다. // 이러한 구성을 통해 Spring Security는 Google OAuth2에서 제공하는 JWT 토큰의 유효성을 검사하고, // 토큰이 유효하면 해당 사용자에 대한 정보를 추출할 수 있습니다. // @Bean // public JwtDecoder jwtDecoder() { // return NimbusJwtDecoder.withJwkSetUri("https://www.googleapis.com/oauth2/v3/certs") // .build(); // } } 이런식으로 나오더군요. 생각하는 로직은 프론트에서 소셜로그인이 성공하면 accessToken을 받고 그거를 바로 서버에 보내줘서 헤더에 담긴 accessToken을 security 기능으로 검증하고 정보를 빼오려고 했습니다. 일반로그인시 제가 만든 JWT를 반환해서 accessToken을 JwtAuthenicationFilter에서 검증한다면 소셜 로그인 accessToken은 security가 지원하는 기능으로 검증하려고 했는데 제가 잘못생각하고 있는건지 소셜 로그인 accessToken이 계속 JwtAuthenicationFilter에서 검사하고 틀린 JWT라고 나오네요.git : https://github.com/YuYoHan/social_login질문 1:제가 생각하고 있는 흐름이 맞나요?질문 2:1번이 맞다면 security 기능으로 사용해서 어떻게 소셜 로그인 accessToken을 검사할 수 있나요?질문 3:1번이 틀렸다면 어느 부분이 틀리고 어떻게 수정해야할까요? 현재 JWT 발급과 JWT를 검증하는 부분은 성공했지만 소셜 로그인 accessToken을 검증해서 정보를 빼와서 JWT를 만들어 반환해주는 부분이 막혀있는 상태입니다 ㅠㅠ 도와주세요
-
해결됨PM을 위한 데이터 리터러시(프로덕트 데이터 분석)
4-8. 지표 정의 연습 문제
안녕하세요! DA를 목표로 하고 있는 대학생입니다. 열심히 강의를 듣고 DA로서 필요한 역량, 스킬을 키우겠습니다. 좋은 강의 감사합니다 :)#1. 기능이 잘 동작하고 있는지 확인하려면?배너 영역, 메뉴 카테고리, 이런 음식 어때요 등 기능이 잘 동작하고 있는지 확인하려면 클릭율인 ‘CTR’을 봐야 한다고 생각합니다. CTR는 어떤 것을 보고(또는 페이지에 접근한 후), 특정 버튼인 Component를 클릭한 비율을 가리킵니다. 즉, 배너 영역으로 예를 들면, 배너영역은 home 페이지에 존재하므로 home 페이지에서 배너 영역을 보고 배너 영역의 버튼을 클릭한 비율을 확인해야 해당 기능이 잘 동작하는지 확인할 수 있는 것으로 해석할 수 있기 때문입니다.배너 영역 = 배너 영역 클릭 수 / home 페이지를 본 수메뉴 카테고리 = 메뉴 카테고리 클릭 수 / home 페이지를 본 수이런 음식 어때요 = 이런 음식 어때요 클릭 수 / home 페이지를 본 수동네 맛집 = 동네 맛집 클릭 수 / home 페이지를 본 수지표가 어떤 식으로 움직이면 잘 동작하는지 확인할 수 있는 방법은 전환율인 ‘CVR’을 봐야 한다고 생각합니다. CVR는 특정 행동을 한 후, 전환된 비율을 가리키는데, 배달 서비스의 최종 목표는 구매 전환율이므로 배너 영역, 메뉴 카테고리, 이런 음식 어때요, 동네 맛집 기능을 클릭한 후, 배달 주문(음식 결제)으로 특정 전환을 하는지 확인하면 해당 기능이 잘 동작하는지 확인할 수 있습니다.배너 영역 = 배너 영역을 클릭한 후, 주문을 한 수 / 배너 영역 클릭 수메뉴 카테고리 = 메뉴 카테고리를 클릭한 후, 주문을 한 수 / 메뉴 카테고리 클릭 수이런 음식 어때요 = 이런 음식 어때요를 클릭한 후, 주문을 한 수 / 이런 음식 어때요 클릭 수동네 맛집 = 동네 맛집을 클릭한 후, 주문을 한 후 / 동네 맛집 클릭 수#2. 검색 만족도 지표고객이 검색 기능에 만족했으면 검색 결과로 나온 음식을 클릭하고 배달 주문(음식 결제)까지 이루어진다고 생각합니다. 즉, 고객이 검색 기능에 만족했는지 확인하려면 배달 주문(음식 결제) 전환율인 CVR을 보면 될 것 같습니다. ‘배달 주문(음식 결제)로 전환된 수 / 검색 기능을 사용한 행동’ 의 식을 활용하여 해당 CVR를 구할 수 있다고 봅니다. 그리고 고객들은 검색 결과가 좋지 못하면 검색 결과 페이지에서 시간을 오래 보내지 않고 다시 검색하여 다른 검색 결과 페이지로 넘어갑니다. 이러한 고객의 특징을 생각하면 검색 결과 페이지를 얼마나 머물렀는지 확인하는 Duration Time(체류 시간)를 확인하여도 검색 기능에 만족했는지 확인할 수 있다고 생각합니다.< 질문 1: CVR은 답이 맞다고 확신이 들지만, Duration Time은 확신이 들지 않습니다. >제가 검색하는 흐름을 생각해본 결과, 2가지로 나누어 검색하는 경향이 있는 것을 확인하였습니다.먹고 싶은 음식(ex. 치킨)은 있으나, 딱히 시켜 먹고 싶은 음식점/브랜드는 없을 때앱을 켜고, 검색 페이지에서 먹고 싶은 음식을 검색한다.검색 결과로 나온 페이지에서 원하는 음식점/브랜드를 들어간다.들어간 음식점/브랜드에서 원하는 음식을 클릭한다.원하는 음식을 담은 후, 결제화면으로 넘어간다.결제화면에서 원하는 결제 방식을 선택하고 배달 주문(음식 결제)을 한다.어떤 음식점에서 어떤 음식을 시켜 먹을지도 정했지만(ex. BHC의 뿌링클), 체인점이 많아 어느 지점에서 시킬지 고민될 때앱을 켜고, 검색 페이지에서 먹고 싶은 음식의 음식점을 검색한다. (ex. BHC)검색 결과로 나온 페이지에서 별점과 후기가 좋은 체인점을 확인한다.원하는 체인점에 들어가서 시켜 먹을 음식을 클릭한다.원하는 음식을 담은 후, 결제화면으로 넘어간다.결제화면에서 원하는 결제 방식을 선택하고 배달 주문(음식 결제)을 한다.#3. 검색 필터 기능의 활성화 지표고객은 검색 결과로 나온 페이지에서 가격 순, 별점 순 등 검색 필터 기능을 사용하여 본인이 중요하게 생각하는 요소로 정렬하여 검색 필터를 사용하는 흐름을 보입니다. 이러한 고객의 검색 필터 기능 사용 과정을 보면, 검색 필터 기능의 클릭율인 ‘CTR’로 검색 필터 기능이 잘 사용되고 있는지 알 수 있습니다. 검색 필터 기능의 CTR은 검색 결과 페이지에서 검색 기능 필터를 보고 클릭한 비율로 알 수 있습니다. 즉, 검색 기능 필터 클릭 수 / 검색 결과 페이지로 구할 수 있습니다.더 나아가 필터 기능이 배달 서비스의 최종 목표인 배달 주문(음식 결제)까지 미치는지는 전환율인 ‘CVR’을 통해 알 수 있습니다. 조금 전에 구한 검색 기능 필터 클릭 수를 활용하여 검색 기능 필터를 클릭한 후, 주문까지 한 수 / 검색 기능 필터 클릭 수로 확인할 수 있다.<질문2: 필터 기능을 사용하고 결제 화면까지 도달한CVR까지 확인해야 검색 필터 기능이 잘 사용되고 있는지 알 수 있다고 생각했는데, 클릭율인 ‘CTR’만 확인해도 충분할까요?><질문 3: 치킨을 먹고 싶어서 ‘치킨’이라고 검색하였는데 방대한 범위의 검색 결과가 나와 불편함을 겪은 적이 많습니다. 예를 들면 치킨이 들어간 빵을 판매하는 빵집이나 치킨도 파는 피자 가게가 나온 경우가 해당됩니다. 검색 기능 필터에 이러한 부분을 포함하면 더 편리한 기능을 제공한다고 생각하는데, 아직까지 이러한 필터 기능을 만들지 않는 이유는 무엇인가요? 포함되면 정말 편할 것 같은데 굳이 제공할만한 기능이 아니라서 그런 것일까요?>#4. 배달 서비스에서 가장 중요한 지표는?배달의 민족, 요기요 등 실제 배달 주문 플랫폼 수익 구조를 살펴보면 가장 큰 축이 되는 부분은 입점한 음식점에서 받는 수수료와 광고비입니다. 입점 음식점과 고객을 중개하여 ‘중개 수수료’를 큰 수익원으로 보고 있는데, 배달팁을 입점 음식점과 소비자가 배달 대행 플랫폼에 나눠 내는 것이 이에 속합니다. 즉, 해당 배달 서비스를 활용하여 배달 주문(음식 결제)가 많이 이루어질수록 배달 서비스가 수익을 많이 가져갈 수 있다는 것으로 해석할 수 있습니다. 광고비 또한 배달 주문(음식 결제)로 진행되어야 배달 서비스가 수익을 가져갈 확률이 높아진다고 생각합니다. 광고를 클릭하고 배달 주문(음식 결제)가 많이 이루어질수록 다음 번에도 음식점이 광고를 할 확률이 높아지기 때문입니다. 이러한 실제 배달 주문 플랫폼 수익 구조를 확인해본 결과, 배달 서비스에서 가장 중요한 지표는 ‘주문(결제) 전환율 CVR’이라고 볼 수 있습니다. 주문(결제)로 전환되는 경우를 생각해보면 고객의 니즈를 충족하는 것이 중요하다고 생각합니다. 배달팁으로 인해 주문(결제)로 전환되지 않은 고객에게 쿠폰을 제공한다면 전보다 주문(결제)이 이루어질 것으로 예상할 수 있습니다. 그러므로 배너 영역에 쿠폰 다운로드 이벤트를 제공하여 평소보다 많은 사람들이 주문(결제)로 전환할 수 있게 하면 될 것 같습니다. 이 외에도 개별 고객이 평소 먹는 음식을 데이터 분석하여 음식 추천 서비스를 제공하는 것도 고객의 편리함과 만족도를 증가시켜 주문(결제) 전환율 CVR를 늘릴 수 있다고 생각합니다.#5. 추천 알고리즘의 성능 지표추천 알고리즘이 잘 동작하는지를 확인할 때는 추천 알고리즘 버튼을 클릭한 비율인 CTR를 알아보면 되지만, 추천 알고리즘의 성능을 확인하기 위해서는 추천 알고리즘이 추천한 상품을 고객이 구매를 했는지 알아봐야 한다고 생각합니다. 즉, 추천 상품을 클릭한 후, 상품 구매로 행동이 전환되는지 파악해야 하므로 ‘구매 전환율 CVR’를 확인해야 합니다. 추천 상품 흐름은 이렇게 3가지로 구성될 것이며,추천 상품 클릭하고 해당 상품을 결제했다.추천 상품을 클릭하고 해당 상품을 결제하지 않았다.추천 상품을 클릭하지 않았다.구매 전환율 CVR = 추천 상품 구매한 수 / 추천 상품 클릭한 수의 식을 활용하여 구할 수 있습니다.#6. 여러분들이 자주 사용하는 서비스의 지표제가 자주 사용하는 서비스는 패션 플랫폼 서비스 ‘지그재그’입니다. 패션 플랫폼 ‘지그재그’는 고객과 쇼핑몰을 연결해주는 B2C 플랫폼 역할을 하고 있습니다. 입점 수수료를 책정하여 수익을 올리는 대부분의 패션 플랫폼과 달리 지그재그는 입점 수수료가 아닌 ‘맞춤형 광고’와 통합 결제 서비스 Z결제와 Z페이 수수료로 수익을 창출합니다. ‘맞춤형 광고’를 통해 노출되길 원하는 타깃 연령층과 고객들에게 제대로 노출되고 구매까지 이루어진다면 광고 비용을 지불한 쇼핑몰은 계속해서 광고비를 지불할 의향이 생길 것입니다. 그리고 고객들이 지그재그를 통해 쇼핑몰 옷을 구매하면 할수록 지그재그가 받을 통합 결제 서비스의 수수료는 증가할 것입니다. 이렇게 이들의 수익구조를 살펴본 결과, 지그재그는 고객이 결제를 해야 수익성을 올릴 수 있기 때문에 패션 플랫폼 서비스 ‘지그재그’에서 중요한 지표는 ‘구매 전환율 CVR’이라고 생각합니다.그 외로 확인해야 하는 지표는 ‘맞춤형 광고 클릭율 CTR’과 ‘Retention’이라고 생각합니다. 맞춤형 광고 클릭율 CTR인 이유는 맞춤형 광고를 통해 제공되는 추천 상품 페이지를 보고 상품을 클릭한 비율을 확인해야 수익성을 제공해주는 맞춤형 광고가 얼마나 제대로 제공되는지 확인할 수 있기 때문입니다. Retention인 이유는 서비스를 사용한 사람이 다시 사용하는 비율을 기간별로 확인할 수 있어, 다시 사용을 할 때쯤 쿠폰을 제공하여 상품을 결제하도록 유도하여 수익성을 높일 수 있다고 생각했기 때문입니다.#7. 퍼널 개선 프로젝트전보다 가입 퍼널에서 온보딩을 더 진행하는 기능을 만들었기 때문에 온보딩을 적게 사용했던 과거의 전환율(약 20%)와 더 진행했을 때의 ‘가입 퍼널 전환율’을 비교하면 온보딩의 효과를 파악할 수 있다고 생각합니다. 데이터 비교 방법으로는 전후 비교와 AB Test가 있는데, 전후 비교는 정확히 온보딩의 효과를 파악할 수 없기 때문에 AB Test를 통해 기존에 제공한 온보딩 기능에서의 가입 퍼널 프로세스 전환율보다 온보딩을 더 진행한 현재에서 가입 퍼널 전환율이 높아졌는지 알아보고 온보딩의 효과를 확인합니다.
-
해결됨외워서 끝내는 네트워크 핵심이론 - 기초
HTTP 1.1이상에서는 어떻게 TCP 연결을 유지하나요?
HTTP의 특징이 Stateless라고 하셨습니다.그런데 HTTP 1.1이상 부터는 한 번 TCP 연결을 한 뒤 여러번의 요청을 보낼 수 있다고 알고 있습니다. 그러면 TCP의 시퀀스와 ACK 번호는 HTTP 요청 마다 계속 커지는 것인가요??즉 www.naver.com에 접속을 할 때 한 번의 TCP 연결 이후에 www.naver.com/blog 이렇게 한다면 ack 번호와 시퀀스 넘버가 계속해서 증가하는 것인지 궁금합니다.감사합니다.
-
해결됨시나브로 자바스크립트
yarn dev 안되요..
강좌에 대해 궁금한 게 있으신가요?