[Spring Security+JWT] HttpOnly방식을 이용한 refreshToken 발급
·
Project 댕린이집
너무 오랜만인듯...정처기 실기와 방통대 과제를 끝내고 돌아왔습니다.그동안 갠프젝을 안했던건 아닌데 상대적으로 투자할 시간이 확 줄어서ㅠㅠ이제 정처기가 끝났으니 그동안 못했던 기록들을 천천히 기록해보겠습니다. JWT를 이용하는 방식을 다시 한 번 정리하자면(1) 유저가 로그인할 때 (2) 서버가 인증 정보를 보내주는데, 암호화나 시그니처 추가가 가능한 데이터 패키지안에 인증 정보(accessToken과 refreshToken)를 담아 보내줍니다.(3) accessToken과 refreshToken이 이후 유저 인증에 사용되는데 (4) 이 정보를 클라이언트에 저장해둡니다.  (5) 이 accessToken을 유저에게만 보여줄 수 있는 정보에 접근할 때 서버에 보내면 (6) 서버는 그 토큰이 유효한지 확인하..
[Spring Security+JWT] JWT는 어디에 저장해야할까? localStorage vs cookie
·
Project 댕린이집
시큐리티와 jwt를 사용한 로그인 기능까지 구현한 후, JWT를 어디에 저장하는 것이 좋을지에 대해 고민해보게 되었습니다. JWT모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰.JWT 정보를 request에 담아 사용자의 정보 조회, 수정 등의 작업을 수행할 수 있습니다. XSS (Crose Site Scripting)악의적인 사용자가 웹 애플리케이션에 악성 스크립트를 삽입하여 사용자 브라우저에서 실행되도록 하는 공격 기법입니다.저장형 XSS, 반사형 XSS, DOM 기반 XSS 등의 유형이 있습니다. CSRF (Cross Site Request Forgery)정상적인 request를 가로채 피해자인 척 하고 백엔드 서버에 변조된 request를 보내 악의적인 동작을 수행하는 공격 기법입니다...
[로그인] 로그인 기능 구현
·
Project 댕린이집
권한까지 구현되었으니 이제 로그인 기능을 구현해보겠습니다. 먼저, 서버 쪽을 하나씩 살펴보면 기본적으로 UserEntity와 UserDTO 그리고 LoginDTO가 있습니다. LoginDTO.java package com.example.demo.dto; import lombok.*; @Getter @Setter @ToString @NoArgsConstructor @Data public class LoginDTO { private String userId; private String password; } UserRepository.java package com.example.demo.repository; import com.example.demo.entity.UserEntity; import org.spr..
[트러블슈팅] org.springframework.security.authentication.InternalAuthenticationServiceException
·
Project 댕린이집
Hibernate: select r1_0.user_id, r1_0.role from user_role r1_0 where r1_0.user_id=?2024-04-08T12:15:58.231+09:00 WARN 23656 --- [nio-8082-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1054, SQLState: 42S222024-04-08T12:15:58.231+09:00 ERROR 23656 --- [nio-8082-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : Unknown column 'r1_0.role' in ..
[회원가입] 권한(Role) 추가
·
Project 댕린이집
각 사용자의 권한을 부여하기 위해 Role과 관련된 테이블을 추가해줬습니다. 사용자(User)와 권한(Role) 간에는 다대다 관계가 있습니다. 즉, 한 사용자가 여러 개의 권한을 가질 수 있고, 한 권한도 여러 사용자에게 할당될 수 있습니다. 매핑 테이블을 만들 때는 보통 각각의 주요 테이블의 기본키(primary key)를 외래키(foreign key)로 참조하며, 이 외래키들이 결합하여 복합 기본키를 형성합니다. 여기서는 "user_role"이라는 매핑 테이블을 만들어 사용자와 권한 간의 다대다 관계를 나타낼 것입니다. user_role 테이블은 다음과 같은 구조를 가집니다. user_id: 사용자를 식별하는 외래키 role_id: 권한을 식별하는 외래키 💻 프로젝트 적용 1️⃣ mySql에 테이블..
[로그인] Spring Security + JWT 로그인 구현
·
Project 댕린이집
사용자 인증 방식은 일반적으로 세션 기반 방식과 토큰 기반 방식(JWT)이 있습니다. 각 방식의 장단점이 있어 상황에 맞게 결정하여 사용하는 것이 중요합니다. 지난 팀 프로젝트의 경우에는 서버 사이드 렌더링 방식이기 때문에 세션 방식을 사용해 구현했었는데요. 이번 개인 프로젝트에서는 클라이언트 사이드 렌더링 방식으로 한 웹 페이지이기 때문에 확장성을 고려하여 토큰 기반 방식으로 구현해보려고 합니다. 한참을 공부하고 헤매이면서 구현한 과정이라 추후에 필요한 부분은 수정, 또 수정을 거쳐서 상세히 기록해보려고 합니다. 1️⃣ 라이브러리 설정 Spring Security와 JWT를 사용하기 위해 다음 라이브러리들을 추가해줍니다. build.gradle dependencies { // Spring Securit..
[회원가입] 비밀번호 확인
·
Project 댕린이집
보안성을 위해 회원가입 시 비밀번호와 비밀번호 확인 필드의 값이 일치하는지 확인하는 과정입니다. 처음에는 아무것도 모르고 비밀번호2 라는 컬럼을 DB에 생성했더랬죠... 하지만 그럴 필요없이 DTO와 프론트단에 필드만 만들어주면 됩니다! [React] Register.js password2 필드를 추가해줍니다. {/* 비밀번호 */} 비밀번호 {/* 비밀번호 확인 */} 비밀번호 확인 UserDTO.java private String password2; 를 추가해줍니다. @JsonProperty("password2") @NotBlank(message = "비밀번호는 필수 입력 값입니다.") @Pattern(regexp = "(?=.*[a-z])(?=.*[0-9]).{8,16}$", message = "비..
[회원가입] 유효성 검사
·
Project 댕린이집
UserDTO에 @Valid 사용 build.gradle implementation 'org.springframework.boot:spring-boot-starter-validatio import import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; @NotBlank @Pattern @Getter @Setter @AllArgsConstructor @NoArgsConstructor @Builder public class UserDTO { private Long id; @JsonProperty("userId") @NotBlank(message = "아이디는 필수 입력 값입니다.") privat..
[회원가입] ResDTO 이용한 아이디 중복 확인
·
Project 댕린이집
아이디 입력 필드 옆에 아이디 중복 확인 버튼을 구현했었는데회원가입 버튼을 누를 시 다시 한번 확인하고 resoponse 해주는 부분을 구현했습니다.  [ ResDTO ]먼저 모든 API의 Response에 대해 공통으로 감싸줄 수 있는 ResDTO를 새롭게 만들어 주었습니다.  🧐 그렇다면 ResDTO를 만드는 이유는 무엇일까요?Response에서 요청된 응답 값만 전달해주는게 아니라 결과에 대한 코드, 내용, 에러메세지 등을 같은 포맷으로 전달해주어 프론트에서 더 효율적으로 사용하게 하기 위한 목적입니다! 또한, 객체 지향적인 설계를 촉진합니다. ResDTO 객체를 사용함으로써 응답 데이터를 하나의 객체로 추상화하고, 응답 생성 및 전달에 관련된 로직을 한 곳에서 관리할 수 있게 됩니다. 서버 사이..
[회원가입] 비밀번호 암호화
·
Project 댕린이집
[  WebSecurityConfig.java  ] PasswordEncoder를 빈으로 등록합니다. @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); }  PasswordEncoder는 주로 사용자의 비밀번호를 해싱(hashing)하여 저장하고, 로그인 시에 비밀번호를 검증하는 데 사용됩니다.   여기서 BCryptPasswordEncoder는 PasswordEncoder의 구현체 중 하나로, BCrypt 해싱 알고리즘을 사용하여 비밀번호를 안전하게 해싱합니다.  [ UserService.java ]package com.example.demo.service;import com.example.demo...
xoo | 수진