이전 포스트에서 Access 토큰 + Refresh 토큰을 사용해 JWT Access 단잁토큰을 이용한 로그인 방식의 보안 문제점을 개선하고자 했다. 하지만 Access 토큰을 요청 헤더에 담으려면 결국 Access 토큰이 클라이언트 사이드에 저장되어야 한다. 즉 프론트 서버에서 토큰을 저장해야 하는데, 쿠키나 LocalStorage에 저장하게 된다...
JWT 토큰 (Access + Refresh) 방식의 보안 문제 고민.
Spring Security + JWT를 이용한 회원가입 및 로그인 (2)
이제 JWT를 어떻게 구현하는 지 알아보자. 버전은 0.12.3 버전이다. JWT (단일 토큰) 로그인 -> 성공 -> JWT 발급 접근 시 -> JWT 검증 위와 같이 로그인이 성공했을 때 토큰을 발급할 뿐 아니라 로그인 이후 어떤 URL에 접근할 때 JWT 토큰에 관한 검증도 필요하다. 따라서 JWT에 관해 발급과...
Spring Security + JWT를 이용한 회원가입 및 로그인 (1)
기본적으로 로그인을 구현하는데 여러 방법이 있다. 쿠키를 사용할 수도 있고, 세션을 사용할 수도 있다. 그 중에서도 이번 프로젝트에서 사용한 로그인 구현 방법에 대해 정리해보려 한다. 왜 Spring Security인가? 스프링 시큐리티는 인증과 권한의 역할을 가진다. 그렇다면 인증과 권한이 정확히 뭘까? 예를 들어 로그인에 대한 인증과 권한을...
Vue 기본 구조 (+ Vue router 페이지 이동이 안됐던 문제), Axios
Vue 기본 구조 public index.html 기타 정적 자원(css, img) //index <!DOCTYPE html> <html lang=""> <head> <meta charset="utf-8"> <meta http-...
ElementCollection 사용 이유, DataJpaTest (vs SpringBootTest)
@ElementCollection recommtoon을 개발하면서 추천을 위해 Webtoon 정보에 장르가 필요했다. 이번에 네이버웹툰을 새롭게 크롤링하려고 보니 장르에 대한 부분이 태그로 좀 더 세분화되어 있었다. 나는 추천 시스템에 이용할 장르가 필요했고, 선호 웹툰 장르 설문조사를 했을 때 사용한 장르들이 있었기 때문에 해당 장르들만 추출하기...
recommtoon.com 기존 프로젝트 정리 및 문제점.
기존 프로젝트 우선 기존에 진행했던 프로젝트에 대한 기능, 각 기능의 이유 등의 정보를 요약해 정리한다. Skill Python, Flask SpringBoot BootStrap, html, css, thymeleaf MariaDB 기능 웹툰 평가 해당 메뉴에서 5개 이상 자신이 본 웹툰에 대해 평가하면 홈 화면...
recommtoon.com 재개발 결정.
그간 Spring, JPA 등에 대해 학습하면서 학습한 내용을 적용해보기 위한 사이드 프로젝트로 해외축구를 주제로 한 프로젝트를 구상했었다. 하지만 기존 구상에서 내가 해결하지 못하는 문제가 있었고, 아쉬웠던 프로젝트인 recommtoon을 다시 제대로 만들어 보기로 결정했다. 기존에 완성했던 결과물은 사실 취업 포트폴리오로 사용하기도 어려웠을 것...
스프링 데이터 JPA + Querydsl
public interface MemberRepository extends JpaRepository<Member, Long> { List<Member> findByUsername(String username); } 문제는 Querydsl로 search를 작성할 수 없다. 따라서 사용자 정의 리포지토리가 필요하다...
순수 JPA + Querydsl
기본 @Repository public class MemberJpaRepository { private final EntityManager em; private final JPAQueryFactory queryFactory; public MemberJpaRepository(EntityManager em) { t...
프로젝션과 결과 반환, 동적 쿼리, 벌크 연산
프로젝션 프로젝션 select 대상 지정 프로젝션 대상이 하나인 경우 List<String> result = queryFactory .select(memeber.username) .from(member) .fetch(); 프로젝션 대상이 하나라면 타입을 명확하게 지정할 수 있...