6. 스프링 시큐리티 사용법
& 웹 어플리케이션 보안
우리가 가져갈 두 녀석
https://www.flickr.com/photos/11325321
7. 앞으로 우리는…
• 스프링, 스프링 부트 그리고 스프링 시큐리티
• 샘플 프로젝트 들여다보기- ‘계’발자 창업하기
• 로그인 기능 추가하기 - 착한 놈, 이상한 놈, 나쁜 놈 구분하기
• 비밀번호 암호화 강도 높이기 - 도둑놈 대비하기
• 권한 나누기 - 배달, 매장 직원 채용하기
45. 계발자 로그인 - Java Code
public class User {
private String id;
private String name;
private String password;
private String address;
private String cellphone;
}
46. 계발자 로그인 - Java Code
@Repository
public class UserRepository {
private static Map<String, User> REPOSITORY = new HashMap<String,
User>();
static {
REPOSITORY.put("placebo", new User("placebo", "임형태",
"password", "010-3535-1414", "경기도 성남시 분당구 삼평동"));
}
public User get(String name) {
return REPOSITORY.get(name);
}
}
47. 계발자 로그인 - Java Code
public class UserToOrderDetails implements UserDetails {
private String id;
private String name;
private String password;
private String cellphone;
private String address;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"));
}
@Override
public String getPassword() { return password; }
@Override
public String getUsername() { return id; }
@Override
public boolean isAccountNonExpired() { return true; }
@Override
public boolean isAccountNonLocked() { return true; }
@Override
public boolean isCredentialsNonExpired() { return true; }
@Override
public boolean isEnabled() { return true; }
}
48. 계발자 로그인 - Java Code
@Service
public class UserToOrderDetailsService implements
UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String id) throws
UsernameNotFoundException {
User u = userRepository.get(id);
if (u == null) {
throw new UsernameNotFoundException(id);
}
return new UserToOrderDetails(u);
}
}
58. 그런데 패스워드는
왜 해시 암호화 해서
저장해야 할까요?
이게 먼 또라이 같은 소리 일까요?
https://www.flickr.com/photos/andrew_mc_d/452713618
59. 해시 함수로의 특징
• 동일한 입력 = 동일한 출력
• 빠른 처리 속도
https://www.flickr.com/photos/27190564@N02/21030267623/i
60. 암호화 해시 함수 취약점
• 동일한 입력 = 동일한 출력
> Dictionary(Rainbow Table) Attack
• 빠른 처리 속도
> Brute-Force Attack
61. 암호화 해시 함수 취약점 보완
• Salt
> Dictionary Attack 에 저항(Resistance)
• Key Stretching
> Brute-Force Attack 에 저항
62. BCryptPasswordEncoder.java
public class BCryptPasswordEncoder implements PasswordEncoder {
private final int strength;
public BCryptPasswordEncoder() {
this(-1);
}
public BCryptPasswordEncoder(int strength) {
this(strength, null);
}
public String encode(CharSequence rawPassword) {
String salt;
if (strength > 0) {
salt = BCrypt.gensalt(strength);
} else {
salt = BCrypt.gensalt();
}
return BCrypt.hashpw(rawPassword.toString(), salt);
}
public boolean matches(CharSequence rawPassword, String encodedPassword) {
return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
}
}
63. 그러면
저는 어떤 해시 알고리즘으로
패스워드를 암호화해서 저장할까요?
현업에서!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
64. 패스워드 암호화
1. HMAC (for salt of PBKDF2)
Hash-based Message
Authentication Code
2. PBKDF2
Password-Based Key
Derivation Function 2
3. Scrypt
4. Individual Salt (64 bytes)
5. SHA256
https://www.flickr.com/photos/biscuitsmlp/2324706925
65. 너희들한테 맡기고
나도 좀 쉬자
누구에게?
https://www.flickr.com/photos/saechang/7005515228/
66. 계발자 채용 공고
• 매니저 : 0 명
• 서빙 : 0 명
• 배달 : 0 명
• 주방 : 0 명
급여 : 업계 최고 우대
특이사항
- 개발 경력 5년 이상 우대
- 거미줄 사용가능 연봉 20% 상향
- 디버깅 능력 필수
https://www.flickr.com/photos/ryc-behindthelens/15733549742/
73. UserRepository.java
@Repository
public class UserRepository {
private static Map<String, User> REPOSITORY
= new HashMap<String, User>();
@PostConstruct
public void init() {
REPOSITORY.put("placebo",
new User("placebo", "임형태","ROLE_USER"));
REPOSITORY.put("spiderman",
new User(“spiderman", "ROLE_DELIVERY"));
REPOSITORY.put("staff",
new User("staff", "ROLE_STAFF"));
}
public User get(String name) {
return REPOSITORY.get(name);
}
}