[회고] 코드숨 스프링 12기 7주차

개발자 춘식이·2022년 12월 25일
0

CodeSoom

목록 보기
7/8
post-thumbnail

7주 차 회고록

7주 차에는 6주 차에서 배웠던 JWT와 더불어 Spring Security 적용해보았다. 처음에는 방대하고 난해한 스프링 시큐리티를 공부해야 하나 갈피를 잘 못 잡았다. 난 지금 JPA 공부하고 싶고 이것만으로도 벅찰 것 같은데 이건 또 언제 공부하지 하며 막막했다. 그래서 결국 트레이너분께 이러한 어려움을 겪고 있다, 어떻게 공부해야 하냐고 여쭤보았는데 스프링 시큐리티가 어려운 게 맞고 지금은 각각 어떤 역할인지, 스프링 시큐리티가 무엇을 해주고 있는지 인식할 수 있는 수준이면 괜찮다고 하셔서 부담을 한시름 덜었다.


7주 차 Keyword

  • Spring Security : Spring Security는 강력하고 커스터마이징할 수 있는 인증/인가를 제공하고 주요 공격(CSRF, HTTP Headers, HTTP Requests과 관련된 공격)으로부터 방어해주는 프레임워크이다. 이를 사용하기 위해서는 build.gradle에 아래 한 줄을 추가해야 한다.
implementation 'org.springframework.boot:spring-boot-starter-security'
  • CSRF : CSRFCross Site Request Forgery의 약어로, 한국어로는 사이트 간 요청 위조이다. 간단하게 설명하자면, 클라이언트(사용자)의 권한을 악용해서 변조된 request를 보내는 공격이다. CSRF은 따로 포스팅할 수 있을 정도로 공부를 나름 했기 때문에, 포스트를 따로 작성할 예정이다. CSRF를 예로 들자면, 아래와 같이 html을 변조해서 input type을 hidden으로 설정하여 submit을 클릭하게 되면 사용자의 비밀번호를 'password'로 변경하도록 request를 변조한다.
<form action="http://주소/csrf/" method="GET">
	Please Click here<br />
	<input type="hidden" name="password_new" value="password"><br />
	<input type="hidden" name="password_conf" value="password"><br />
	<br />
	<input type="submit" value="클릭 시 보너스 포인트 제공!" name="Change">
</form>
  • BCryptPasswordEncoder : BCryptPasswordEncoderBCrypt라는 강력한 해싱 함수를 사용한 비밀번호를 암호화해주는 시큐리티 클래스이다. 내부적으로 무작위의 salt을 부여해서 여러 번 해시를 적용하기 때문에 같은 비밀번호더라도 결과가 다르게 나온다. encode() 메소드를 통해서 비밀번호를 암호화하고, 평문으로 복호화가 불가능❌하므로 matches()메소드를 통해서 사용자가 입력한 비밀번호와 저장된 비밀번호가 일치한 지 확인해준다.
  • Collections.singleton() : authorities(Collections.singleton(authority)) 이렇게 작성했는데, 일반 사용자가 가입하는 경우에는 USER 딱 하나의 권한만 주고, 절대불변하게 유지하기 위해 사용한 의도이다. 이를 다른 곳에서 수정하려고 한다면 UnsupportedOperationException 예외를 던진다. Collections.singleton()Set.of() 메소드와 비슷한데, 차이점은 Set.of()null을 포함시킬 수 없다.

코드 리뷰 코멘트

📌 추후 권한이 수정되어야 할 일이 생기면 Collections.singleton이나 Set.of 메소드를 지양하는 편이 좋은가? -> 만약 권한이 수정되어야 하더라도 권한 자체를 변경하기보다는 새로운 컬렉션을 만들어서 설정하면 된다.

📌 메소드 앞에 빈칸이 있는지 확인하기

📌 Authority 대신 User를 조회하는 방법도 있다. (아래 사진 참고)


마무리

마침 회사에서 보안 교육을 듣던 중에 스프링 시큐리티를 함께 배울 수 있어서 운이 좋았다. 당연한 말이지만, 개발자는 정보보안 인식과 보안 지식이 절대적으로 필요하다. 개발자로서 보안 지식이 조금이나마 함양되어 레벨업 한 느낌이 든다. 국비에서 스프링 시큐리티는 BCryptPasswordEncoder를 사용하기만 하고 제대로 공부하지 않았었다. ㅎ 한번은 면접에서 matches() 메소드를 헷갈려서 BCryptPasswordEncoder는 복호화가 가능하다고 대답했었던 적이 있었는데 이참에 확실하게 배워간다. 나는 확실히 이렇게 실수를 통하면서 배워나가는 게 큰 것 같다.
다음 주가 드디어 코드숨 마지막 주 && 2022년 마지막 주! 유종의 미를 잘 거두자!

profile
춘식이를 너무 좋아하는 주니어 백엔드 개발자입니다.

0개의 댓글