728x90

문제점 : MySQL 데이터데이스에 defalut값을 설정해놨으나, SpringBoot에서 JPA로 데이터를 Insert할 때 값을 넣지 않으면 default값이 아닌 null이 들어갔다. 음.. 빈 값이 아닌 null이 들어가서 그런 것 같다.

 

해결 : @DynamicInsert와 @DynamicUpdate를 @Entity에 같이 작성해준다.

@DynamicInsert : insert 시 null인 필드 제외

@DynamicUpdate : update 시 null인 필드 제외

728x90

1. 테이블 데이터 포함 테이블 삭제

사용법 : DROP TABLE 테이블명;

DROP TABEL 'board'.'tb_userinfo';

 

2. 테이블 데이터 삭제

사용법 : TRUNCATE 테이블명;

TRUNCATE 'board'.'tb_userinfo';
728x90

문제점 : SpringBoot 프로젝트 진행 중 테스트 데이터를 넣고 삭제하면 id 값이 1부터 다시 시작이 아닌

(삭제 전의 마지막 값 + 1) 로 시작됐다.

보기 좋지 않아서 초기화 하는 방법을 찾아봤다.

 

사용법 : ALTER TABLE 테이블명 AUTO_INCREMENT=1;

 

 

728x90

1. 의존성 추가

 - build.gradle 에 다음 의존성을 추가해준다. 

 

implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.security:spring-security-test'

 

 

 - Maven의 경우 pom.xml 파일에 다음을 추가한다.

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-test</artifactId>
  <scope>test</scope>
</dependency>

2. 시큐어Configure 파일을 생성해서 다음의 코드를 작성해준다.

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http
                .authorizeRequests()
                    .antMatchers("/css/**").permitAll()
                    .antMatchers("/board/**").authenticated()
                    .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") // 권한 설정
                    .anyRequest().permitAll() 
                    .and()
                .formLogin()
                    .loginPage("/loginForm") // 로그인 페이지
                    .loginProcessingUrl("/login")
                    .defaultSuccessUrl("/")
                    .and()
                .logout()
                    .permitAll();
    }
}
  • @EnableWebSecurity : 스프링 시큐리티 필터가 스프링 필터체인에 등록된다.
  • BCryptPasswordEncoder : 유저의 패스워드를 암호화하는 인코더
  • authorizeRequests() : 시큐리티 처리에 HttpServletRequest를 이용하겠다는 의미
  • antMatchers() : 특정 경로 지정
  • permitAll() : 접근 허용
  • authenticated() : authorizeRequests에 적힌 경로는 로그인 후에 접근 가능
  • access : 주어진 SpEL표현식의 결과가 true이면 접근 허용
  • hasRole('ROLE_ADMIN') : 권한이 ROLE_ADMIN인 경우만 접근 가능
  • anyRequest().permitAll() : 그 외 요청은 허용
  • loginProcessingUrl("/login") : 시큐리티에서 로그인을 대신 진행하도록 정의 -> 컨트롤러에 안만들어도 됨.

 

3. 비밀번호 인코딩

@PostMapping("/join")
public String join(Member member){ // view의 form->input 의 name과 매핑됨.
    String encPwd = bCryptPasswordEncoder.encode(member.getPassword());
    member.setPassword(encPwd);

    memberService.join(member);

    return "redirect:/loginForm";
}
  • 컨트롤러에서 BCryptPasswordEncoder 객체를 이용해서 encode 함수를 통해 인코딩 한다.

-

 

 

* 해당 글은 인프런에 게시된 '최주호'님의 강의를 듣고 개인적으로 정리한 글입니다.

강의 출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0

728x90

1. MySQL에서 테이블을 만들어준다.

ID에 적용할 것이므로 AI(Auto Increment) 체크!

 

2. 자바 코드에서 Model에 @GeneratedValue 어노테이션을 추가해준다.

@GeneratedValue(strategy = GenerationType.IDENTITY)

다음은 코드에 적용한 모습이다.

 

728x90

JWT란?

JSON 정보를 안전하게 전송하기위한 방식. HMAC, RSA 또는 ECDSA를 사용

1.구조 : Header.PayLoad.Signature(서명)


1.1 Header는 typ(토큰의 타입), alg(알고리즘 방식)으로 구성
여기서 alg는 서명을 해싱하기 위한 알고리즘이다.

1.2 PayLoad는 여러 정보들 (쉽게 유저 정보 정도)

1.3 서명은 Header와 PayLoad 그리고 시크릿키를 가지고 암호화 (HS256은 시크릿키를 포함하지만 RSA는 헤더와 페이로드를 개인키로 암호화 한다.)

  • Header, PayLoad, 서명은 각각 base64로 암호화 되어있다. -> 디코딩 또한 가능 (해시는 디코딩 불가능)
  • 이 원리를 통해 암호화에 목적이 있는 것이 아닌 서명에 목적을 두며 데이터가 유효한지 검증하기 위한 작업을 할 수 있다고 한다.

2. 작동 방식

 

1. 클라이언트에서 서버로 로그인 시도를 하면 서버에서 JWT 토큰을 만들어 되돌려 준다.
2. 클라이언트는 보통 이 토큰을 로컬스토리지에서 가지고 있는다.
3. 클라이언트에서 서버에 개인정보를 요청하면서 JWT 토큰을 서버에 전달한다.
4. 서버에서 토큰을 검증하여 클라이언트에서 요청을 보낸 사용자가 신뢰할 수 있는 사용자인지 검증한다.

5. 요청 받은 정보를 페이로드를 통해 DB에서 일치하는 정보를 찾아 리턴한다. 

  • 검증하는 방법 : 클라이언트에서 전달 받은 JWT 토큰과 비교한다.
  • 무엇을 비교해? : 서버에서 Header와 PayLoad, 시크릿키 등을 암호화 해보고 결과가 전달받은 JWT 토큰과 똑같은지 검증한다.

HMAC? : 서명을 Header와 PayLoad, 시크릿키를 이용해서 암호화

 

RSA?

  • Header.PayLoad.서명
  • 서명 : (헤더+페이로드)를 개인키로 암호화
  • 위에 기술된 내용은 HMAC을 예로 기술한 내용이며, 서명이 (헤더, 페이로드, 시크릿키)로 구성 됐다는 차이뿐이다.
  • RSA 검증 시 : 클라이언트가 서버에 요청하면 공개키로 서명을 검증하기만 하면 됨.

 

-

 

 

* 해당 글은 인프런에 게시된 '최주호'님의 강의를 듣고 개인적으로 정리한 글입니다.

강의 출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0

728x90

JWT는 HMAC, RSA 또는 ECDSA를 사용한다.

 

그 중 RSA는 공개키개인키를 사용한 방식으로, 전자서명에서도 사용된다.

 

1. 공개키로 메세지를 암호화하고

2. 개인키로 복호화 할 수 있다.

728x90

GET 방식이란? : http method 방식 중 하나로 url을 통해 정보를 전달하는 방식이다.

 

GET방식에는 2종류가 있다.

 - Query String 방식

 - Path value 방식

 

1. Query String 방식

 - 사용 시기 : 필터링을 하고 싶을 때

 ex) /users?id=1

 

2. Path value 방식

 - 사용 시기 : resource를 식별하고 싶을 때 

 ex) /users/1 

 

/users  : 사용자 전체의 목록

/users?occupation=programer  : 직업이 프로그래머인 사용자 목록

/users/1 : id가 1인 사용자

 

[출처]

https://ooeunz.tistory.com/43?category=849959

728x90

Spring 프로젝트에서 css 작업을 위해 Bootstrap을 사용하기로 했다!

 

HTML 파일에서 사용해보긴 했으나, JSP파일에서 사용이 가능한지 확인할 겸, 사용법을 정리하고자 한다.

 

https://getbootstrap.com/

 

Bootstrap

The most popular HTML, CSS, and JS library in the world.

getbootstrap.com

 

부트스트랩 홈페이지이다. 들어가면 Get Started를 누르면 나오는 코드들이 있다.

위 2개의 코드를 복사하여 JSP 파일 또는 HTML 파일 상단에 붙여 넣어준다.

 

그 후 부트스트랩을 사용 가능한지 테스트를 위해 버튼을 하나 만들어 보겠다.

 

 

좌측 상단에서 Button을 검색한다. 그럼 여러 가지 버튼 소스들이 나오는데 소스를 복사하여 JSP 파일 또는 HTML 파일에 붙여 넣어준다.

 

필자는 예시로 button태그를 하나 복사하여 붙여넣어 주었다.

 

프로젝트 실행 후 화면은 다음과 같다.

 

버튼 외에도 다양한 스타일의 CSS를 간단하게 적용해볼 수 있으니 잘 사용하면 유명 사이트 못지않은 사이트를 만들어 볼 수 있겠다!

+ Recent posts