전에 인증을 위한 설정을 마쳤다면 이제는 jwt를 통해 인증/인가 를 해보자 . jwt에 대한 설명은 하지 않겠다. 구글링하면 아주 자세히 설명해준다. 우리가 하고자하는 방식은 jwt를 생성해서 헤더에 넘기고 들어오는 요청의 jwt를 확인하여 검증하는 것이다. 검증하는 방법은 요청되어 들어오는 jwt를 Base64 디코딩하여 디코딩된 Header, payload, 서버에 내장된 secretKey 세가지를 통합해 HMAC SHA256 인코딩해 요청된 jwt의 signature와 같으면 검증이 완료된 것으로 본다. 로그인 시큐리티를 사용하면 내부설정을 변경하지않으면 디폴트로 /login 에서 로그인을 해야한다. 파라미터 이름도 username 과 password로 정해져있다. 1. username, pass..
이번에는 서버요청에 권한을 함께 보내 보안을 강화해보려 한다. 일반적인 사용자라면 앱이나 웹을 통해 정상적인 루트로 서버에 API요청을 보내겠지만 그게아닌 PostMan등의 개발 API플랫폼을 통해 서버데이터에 접근 하여 데이터를 조작할 수 있다. 예를 들어 아래와 같은 게시글 작성API POST요청에 memberId만 바꾸어 보내면 다른 사람이 쓴 글이 되어 버려 치명적인 문제가 될 수 있다. 이를 보안하기 위해 기존 프로젝트에 Spring Security를 적용해 사용자에게 권한을 주어 인가된 사용자만 데이터에 접근 할 수 있게 바꿔보자. 필자와 같이 Spring을 독학하고 Inflearn 김영한님의 스프링완전정복으로 공부한 사람들은 Security가 낯설게 느껴질 것이다. 강의에서는 웹에서 Secu..
지금 회원 테이블 저장방식은 사용자의 입력을 그대로 받아 저장하는 방식이다. 사용자가 비밀번호로 "1234" 를 입력하면 테이블에도 그대로 1234를 저장한다. 이런 지극히 단순한 방식은 딱 보기에도 보안에 굉장히 취약하고 끔찍하기 그지없는 방식이다. 지금부터 비밀번호를 암호화해서 저장하는 방식으로 고쳐 볼 것이다. 구글에 비밀번호 암호화를 쳐보면 대부분이 Spring Security를 사용해서 암호화를 한다. 그러나 나는 Spring Security에 대한 이해가 부족하다.... 마냥 따라하면 되긴 하겠지만 썩 끌리지 않는다. 나중에 Security의 기본적인 이해를 하고 적용해 보도록 하고 지금은 다른방식으로 암호화를 해보자. gradle에 추가 jbcrypt 라이브러리를 사용한다. implement..
게시글을 작성하고 저장하는 시점의 시간을 추가해 게시글이 언제 씌여졌는지 알 수 있게 해보려 한다. 일단 코드 먼저보자 전체 코드 @EntityListeners(AuditingEntityListener.class) @MappedSuperclass @Getter public class TimeEntity { @CreatedDate @Column(updatable = false) private LocalDateTime createdDate; @LastModifiedDate private LocalDateTime lastModifiedDate; } 이 클래스를 게시글 클래스에 상속하여 사용하기만 하면 끝이다! @EntityListeners는 엔티티의 변화를 감지하고 테이블의 데이터를 조작하는 일을 한다. @M..
이제 진짜 REST API를 다뤄보자 MemberController 와 PostsController를 만드려고 한다. MemberController 로그인 회원가입 가입된 회원 조회 PostsController 게시글 전체 조회(본문빼고) 한개의 게시글 조회(본문포함) MemberController @RestController @RequiredArgsConstructor @Slf4j @RequestMapping("/api") public class MemberApiController { //생성자 주입 private final MemberRepository memberRepository; private final LoginService loginservice; private final RegisterSe..
Entity를 만들었으니 Repository를 작성해보자. Repository는 DataJPA를 사용해서 구현한다. 사용법은 인터페이스로 파일을 만들고 JpaRepository를 상속하고 해당 객체와 해당 객체 PK타입을 넣어주면 된다. JpaRepository에 기본적인 기능들은 전부 구현되어 있다. 이를 Override 해서 고치거나 있는 그대로 사용하면 된다. MemberRepository public interface MemberRepository extends JpaRepository { //아이디로 검색 @Override Optional findById(Long id); //이름으로 검색 Optional findByUsername(String username); //모든 유저이름 리스트만 조회..
먼저 간단한 기초 엔티티설계를 한다. 한명의 회원은 여러개의 게시물을 쓸 수 있고 한개의 게시물은 여러개의 댓글을 가질 수 있는 형태이다. 본문은 이미지가 들어가는 등 데이터 사이즈 자체가 클 수 있어 따로 분리했다. 회원테이블 @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; @NotEmpty private String username; @NotEmpty private String password; @OneToMany(mappedBy = "member") private List posts = new ArrayList(); protected Member() ..
- Total
- Today
- Yesterday
- Spring 대댓글
- authorization
- ChattingApp
- loadbalancing
- Security
- Stomp RabbitMQ
- Spring Stomp
- Kubernetes
- 로컬캐시
- Bcypt
- ERD설계
- Spring
- nativeQuery
- 푸시알림동작원리
- 웹소켓 채팅
- springboot
- bcrypt
- Spring 채팅
- spring orphan
- Stomp Kafka
- Vmmem종료
- Authentication
- Spring RabbitMQ
- FCM
- 게시판 채팅
- Flutter
- MessageBroker
- Spring WebSocket
- Vmmem
- Cache
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |