전체 글 338

스프링부트 팀플) 20240414 JWT 적용(Oauth2 포함)

JWT란? ( JSON Web Token) - Map의 데이터타입처럼 Key-Value 구조를 가지고 있으며 Web Token으로 사용할 수 있다. 왜 토큰을 쓸까? --> 이걸 이해하기 위해서는 쿠키와 세션에 대해 알아야 한다. 그러면 쿠키와 세션을 왜 쓸까? - HTTP 통신은 Request와 Response가 끝나면 stateless이기 때문에 연결을 끊는다. (쉽게 말해 요청-> 종료 과정이 종료되면 그 상태가 더이상 유지되지 않는다) --> 이런 특징으로 인해 로그인 상태 유지에 문제가 발생한다. ---> 누가 로그인 중인지 기억하기 위해 쿠키/세션/토큰을 사용한다. 쿠키란? - 공개 가능한 정보를 사용자의 브라우저에 저장시켜, 사용자의 사용 경험을 향상시켜준다. - 서버는 클라이언트 측에 저장..

스프링부트 팀플) 20240412 구글 로그인 수정 및 소셜로그인 여부에 따른 과정 로그인/회원가입 변경

우선 구글 로그인 문제는 생각 이상으로 싱거운 이유였다... secret_code 맨 마지막 글자 하나가 빠져 있었던 것... 왜 그런데 처음에는 uri 에러라고 뜨다가 토큰 만료 에러가 출력되었던걸까? 아무튼 허무하게 해결되었다. 소셜 네트워크 가입자에 따른 jsp 출력 변경 이유는 다음과 같다. 1. 소셜네트워크에 가입한 다음, 회원가입/아이디찾기/비밀번호 찾기를 하는 사람은 왜 발생할까? --> 대부분은 본인이 소셜네트워크로 가입한 것을 까먹었기 때문일 것이다. --> 그걸 알려주면 관련 기능을 쓰지 않을 확률이 높다 (굳이 따지자면 아이디+비밀번호로도 로그인하고 싶은 사람은 회원가입을 원할 것이다) --> 로그인/회원가입 관련 다양한 기능을 사용하는 대신, 소셜네트워크 로그인 버튼만 누르고 관련 ..

스프링부트 팀플) 20240411 스프링시큐리티+소셜로그인(네이버/카카오

기존의 소셜로그인에서 스프링시큐리티를 더하는 시스템을 구현했다. 생각보다 너무 복잡하고 어렵더라... 심지어 아직 구글은 구현이 안 된다...이유는 몰루 Redirect_Uri가 다르다고 뜨다가 결국 token이 만료되었다고 뜨기에 이르렀다. 아직 시스템도 손볼 것이 많지만 일단은 포스팅 org.springframework.security spring-security-oauth2-client 5.7.7 우선 pom.xml을 수정해서 oauth2 의존성을 추가한다. #Registeration #Naver Login spring.security.oauth2.client.registration.naver.client-name=naver spring.security.oauth2.client.registratio..

스프링부트 팀플) 20240410 스프링시큐리티를 통한 로그인

Spring Security란? Spring Security는 인증, 권한 관리 그리고 데이터 보호 기능을 포함하여 웹 개발 과정에서 필수적인 사용자 관리 기능을 구현하는데 도움을 주는 Spring의 강력한 프레임워크이다. 일반적으로 개발 시 가장 먼저 작업하는 부분이 사용자 관리 부분으로 가볍게는 회원가입부터 로그인, 로그아웃, 세션 관리, 권한 관리까지 온라인 플랫폼에 맞춰 다양하게 작업되는 인가 & 보안 기능은 개발자에게 많은 시간을 요구한다. Spring 생태계 내에서 이러한 요구사항을 효과적으로 지원하기 위해 개발된 것이 Spring Security로 개발자들이 보안 관련 기능을 효율적이고 신속하게 구현할 수 있도록 도와준다. 그런데 나는 이걸 회원가입부터 다 구현하고 난 다음에 맨 마지막에 이..

스프링부트 팀플) 20240405 익명게시판 댓글/대댓

올린 줄 알고 있었는데, 멍청하게 임시저장만 해놓고 올리질 않았다... 아무튼 이번에 구현한 기능을 크게 6가지 1. 댓글 출력 2. 댓글 등록 3. 댓글 삭제 4. 대댓글(답글) 출력 5. 답글 등록 6. 답글 삭제 이때 발생하는 문제는 다음과 같다. 1. 처음에 댓글을 어떻게 출력을 할 것인가? 2. 댓글 등록/삭제 후에 어떻게 출력을 할 것인가? 3. 답글을 댓글에 맞춰서 어떻게 출력을 할 것인가? 4. 어떻게 댓글에 맞춰서 답글을 등록/삭제할 것인가? 우선 전체적으로 AJAX처리를 통해 출력/등록/삭제를 진행했다. 한 마디로 게시글에 입장한 뒤에 댓글/답글과 관련된 모든 행동을 브라우저의 URL이 전혀 이동하지 않는다. 이를 통해 유저는 페이지가 전환되어 계속 스크롤을 내리는 등의 불편함을 가질 ..

스프링부트 팀플) 20240403 properties분리 / 회원가입 로딩창 구현

몇 일동안 application.properties의 민감한 정보를 다른 곳에 옮기려고 애를 썼는데 굉장히 쉽게 끝났다.. 별거 없어도 알아서 잘 돌아가더라... 이후, 새로운 properties파일에 옮기고 싶은 정보를 입력한다. 기존 application.properties파일 내의 정보를 그대로 복붙하면 된다. 그 다음 application.properties에 profiles 설정을 한다. 그러면 application.properties에 자료가 없어도 알아서 잘 읽어온다. 원래는 profile를 나누기 위해 사용하는 장치지만 쓰는 사람 마음대로지. 추가로 새롭게 만든 application-dev.properties파일을 gitIgnore 처리를 한다. 본래 profile을 사용하고자 한 이유는 ..

스프링부트 팀플) 20240401 외부API가입자 안내 / 비밀번호 바꾸기 메일

오늘 한 작업은 크게 3가지 1. userId를 username으로, userPw를 password로 바꾸기 조만간 Spring Security를 적용할 예정인데, 그때 아이디를 username, 비밀번호를 password로 바꾸어야 한다는 것을 알게 되었다. 어차피 나중에 DB바꿀 거라면 지금 바꾸는 편이 나을 것이라는 생각에 바꾸게 되었다. 현재 userId를 Primary Key로 쓰고 있는데, Sequence로 바꿀지도 고민중이다. 다만, 그럴 경우 일이 너무 커질 것 같아서... 아무튼 일단 username, password로 수정 2. 외부API가입자 안내 현재 외부API가입자는 관리의 편의성을 위해 회원가입 처리를 하게 된 상태이다. 그래서 외부API로 가입을 한 사람은 내부API로 가입할 ..

스프링부트 팀플) 20240331 여러 방식의 로그인의 일원화

평범하게 사이트 내에서 가입한 아이디이다. 구글 연동 / 네이버 연동 / 카카오 연동 여부가 0으로 표시되고 있는데, 이는 해당 외부API와 연동되지 않았다는 뜻이다. 해당 아이디로 네이버 로그인을 해보겠다. 사실 엄청난 처리를 한 것이 아니라서 코드 상 작업도 별로 없었다. 그러니 기존의 카카오 로그인 코드에서 변경된 부분만 올린다. //아이디 String jsonString2 = objectMapper.writeValueAsString(map.get("kakao_account")); JsonNode jsonNode2 = objectMapper.readTree(jsonString2); String id = jsonNode2.get("email").asText(); //이미 가입한 사람인지 확인 Memb..

스프링부트 팀플) 20240331 아이디의 이메일화

앞서 개인정보제거를 끝내고 외부API로그인을 작업을 준비할 때 "어차피 이메일로 동일성 확인을 할 거라면 이메일이 아이디인 것이 맞지 않을까?" 하는 생각이 들었다. 이메일로 동일성 확인을 하는 이유는 구글 로그인할 때 accessToken으로 이름과 이메일을 받아오긴 하지만 이름을 영문으로 하는 경우가 많아, 카카오/네이버와 달리 이름의 동일성 확인이 어렵기 때문이다. 그리고 카카오와 네이버에서 받아올 수 있는 이름/핸드폰번호로 인한 개인정보 문제도 있었고, 핸드폰번호로 동일성 검사를 하면 네이버-카카오의 동일성 검사 밖에 할 수 없다. 하지만 이메일로 검사하면 구글-카카오, 구글-네이버 2경우로 늘어나기 때문에 이편이 좋다는 생각이 들었다. 어찌되었든 이대로 그냥 아이디와 이메일을 냅둔 채, 강행하면..

스프링부트 팀플) 20240330 개인정보 제거

오늘 처음으로 멘토님을 만나고 피드백을 들을 수 있었다. 로그인/회원가입 쪽에서 들은 가장 큰 문제점은 개인정보가 들어갔다는 점. 보안 능력이 따라주면 상관없지만, 아직 미숙하기에 보안을 지킬 수 없다면 아예 다 제거하기로 했다. 으... 우선 DB, DTO부터 수정 CREATE TABLE memberDB ( userId VARCHAR2(50) PRIMARY KEY, userPw VARCHAR2(50) NOT NULL CHECK (LENGTHB(userPw) >= 4), nickname VARCHAR2(30) UNIQUE NOT NULL, userEmailId VARCHAR2(50) NOT NULL, userEmailDomain VARCHAR2(50) NOT NULL, restoreUserEmailId ..